2

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

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)

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

2 ответа2

7

Я сделал

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

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

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

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

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) работает в подоболочке, созданной при запуске процесса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .