Вопрос: В чем разница между $ (...) и `...` в Bash


Я получил ожидаемый результат с `...`, но не с $ (...)

kill $(ps ux | grep S..\.tcl | grep -v grep | awk '{print $2}')

Illegal variable name.

kill `ps ux | grep S..\.tcl | grep -v grep | awk '{print $2}'`

(kill expected processes)

По googling, я нашел, что некоторые говорят, что они взаимозаменяемы, но это не по этому примеру. Итак, в чем разница между $ (...) и `...` в Bash?


2
2018-06-26 02:59


Источник


Я не получаю эту ошибку, когда я запускаю вашу команду выше, она должна работать как написанная с помощью $ (). - ChasingLogic
Я тоже не ошибаюсь. Одна из возможностей заключается в том, что сценарий фактически не работает под bash. Можете ли вы предоставить подробную информацию о том, какую ОС вы используете, как выполняете сценарий и версию оболочки? - John1024


Ответы:


Я сделал

grep -al 'Illegal variable name' /bin/*

и нашел сообщение в / bin / csh. Похоже, вы бежите CSH не bash, когда вы даете команду. например:

csh $ echo `echo abc`
abc
csh $ echo $(echo abc)
Illegal variable name.

7
2018-06-26 13:44



Это правильный ответ. csh это не раковина бурна! Его правила цитирования и связанные с ними функциональные возможности полностью другой. Если вы используете csh, не ожидайте, что все будет работать так, как они работают в bash (или, если на то пошло, работать вообще; csh довольно ужасно) - Wouter Verhelst
Ой! Большое спасибо! Я не знаю, почему я тестировал их в csh / tcsh, и я этого не нашел. Кроме того, я не знал, что выходная строка в оболочке может быть найдена с помощью grep. - Arton


Некоторое объяснение обратного хода (`) также называется подстановкой команд:

https://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-commands

https://stackoverflow.com/questions/4708549/whats-the-difference-between-command-and-command-in-shell-programming

В bash (git-bash) я получаю и другие результаты. Запуск скрипта в файле, скажем /c/pathToScript/test.sh

#!/bin/bash
WORK_DIR=/c/myWorkingDirPath;
cd $WORK_DIR;
if [ `pwd` != $WORK_DIR ]; then
  echo "Oh my... "; # `pwd` returns /c/pathToScript 
fi
if [ $(pwd) != $WORK_DIR ]; then
  echo "Thank Goodness... "; #$(pwd) returns /c/myWorkingDirPath
fi

$ (Pwd) работает в подоболочке, созданной при запуске процесса.


-1
2017-07-13 14:54