Jaka jest różnica między $ (…) a `…` w Bash

2

Otrzymałem oczekiwany wynik z `...`, ale nie udało mi się z $ (...)

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)

Po przejrzeniu google stwierdziłem, że niektórzy mówią, że są one wymienne, ale nie w tym przykładzie. Jaka jest różnica między $ (...) a `...` w Bash?

Arton
źródło
2
Nie dostaję tego błędu, kiedy uruchomię powyższe polecenie, powinno działać jak napisane za pomocą $ ().
ChasingLogic
1
Nie dostaję też błędu. Jedną z możliwości jest to, że skrypt nie działa w trybie bash. Czy możesz podać szczegółowe informacje na temat używanego systemu operacyjnego, sposobu wykonywania skryptu i wersji powłoki?
John1024

Odpowiedzi:

7

zrobiłem

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

i znalazłem wiadomość w / bin / csh. Wygląda na to, że uruchamiasz csh not bash podczas wydawania polecenia. na przykład:

csh $ echo `echo abc`
abc
csh $ echo $(echo abc)
Illegal variable name.
meuh
źródło
1
To jest poprawna odpowiedź. cshnie jest skorupą Bourne'a! Zasady cytowania i powiązana z nimi funkcjonalność są zupełnie inne. Jeśli używasz csh, nie oczekuj, że wszystko zadziała tak, jak działa w bash (lub, w ogóle, działa w ogóle; cshjest dość okropne)
Wouter Verhelst
O! Wielkie dzięki! Nie wiem, dlaczego przetestowałem je w csh / tcsh i nie znalazłem tego. Ponadto nie wiedziałem, że ciąg wyjściowy w powłoce można znaleźć w grep.
Arton
-1

Niektóre objaśnienia dotyczące znaku wstecznego (`) również nazywają podstawianie poleceń:

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

W bash (git-bash) również otrzymuję różne wyniki. Uruchomienie skryptu w pliku, powiedz /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) działa w podpowłoce utworzonej podczas uruchamiania procesu.

użytkownik1228818
źródło