Qual è la differenza tra $ (...) e `...` in Bash


2

Ho ottenuto il risultato atteso con `...`, ma non sono riuscito con $ (...)

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)

Cercando su google, ho scoperto che alcuni dicono che sono intercambiabili, ma non è con questo esempio. Quindi, qual è la differenza tra $ (...) e `...` in Bash?


2
Non ricevo questo errore quando eseguo il comando precedente dovrebbe funzionare come scritto con $ ().
ChasingLogic,

1
Neanche io ricevo l'errore. Una possibilità è che lo script non sia effettivamente in esecuzione sotto bash. Puoi fornire dettagli su quale sistema operativo stai usando, come stai eseguendo lo script e la versione della shell?
Giovanni 1024,

Risposte:


7

Ho fatto un

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

e ho trovato il messaggio in / bin / csh. Sembra che tu stia eseguendo csh non bash quando dai il comando. per esempio:

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

1
Questa è la risposta corretta cshnon è un guscio bourne! Le sue regole di quotazione e le relative funzionalità sono completamente diverse. Se stai usando csh, non aspettarti che le cose funzionino nel modo in cui funzionano in bash (o, del resto, funzionano affatto; cshè piuttosto orribile)
Wouter Verhelst,

Oh! Molte grazie! Non so perché li ho testati in csh / tcsh e non l'ho trovato. Inoltre, non sapevo che la stringa di output nella shell potesse essere trovata con grep.
Arton,

-1

Alcune spiegazioni sul backtick (`) chiamato anche sostituzione dei comandi:

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

In bash (git-bash) ottengo anche risultati diversi. Esecuzione di uno script in un file, ad esempio /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) funziona nella subshell creata quando eseguo il processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.