Cosa significa in shell quando inseriamo un comando all’interno del simbolo del dollaro e parentesi: $ (comando)

Voglio solo capire la seguente riga di codice nella shell. È usato per ottenere la directory di lavoro corrente. Sono consapevole che il nome $(variable) restituisce il valore all’interno del nome della variabile, ma che cosa dovrebbe restituire $(command) ? Restituisce il valore dopo l’esecuzione del comando? In tal caso, possiamo usare ` per eseguire il comando.

 CWD="$(cd "$(dirname $0)"; pwd)" 

Lo stesso output può essere preso dalla seguente riga di codice anche in diverse versioni di shell

 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 

Non riesco a capire il significato di $(cd.. e $(dirname .

Qualcuno potrebbe aiutarmi a capire come viene eseguito questo comando?

L’utilizzo del $ like ${HOME} fornisce il valore di HOME. L’uso di $ like $(echo foo) significa eseguire qualunque cosa sia all’interno delle parentesi in una subshell e restituirla come valore. Nel mio esempio, avresti foo perché echo scriverà foo per standard

 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 

Could anybody help me to figure out how this command get executed?

Diamo un’occhiata a diverse parti del comando. BASH_SOURCE è una variabile dell’array bash contenente i nomi dei file di origine. Quindi "${BASH_SOURCE[0]}" ti restituirebbe il nome del file di script.

dirname è un’utilità fornita da coreutils GNU che rimuove l’ ultimo componente dal nome file. Quindi se esegui il tuo script dicendo bash foo , "$( dirname "${BASH_SOURCE[0]}" )" ritornerebbe . . Se hai detto bash ../foo , sarebbe tornato .. ; per bash /some/path/foo sarebbe ritornato /some/path .

Infine, l’intero comando "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ottiene la directory assoluta contenente lo script che viene invocato.

$(...) consente la sostituzione del comando, ovvero consente l’output di un comando per sostituire il comando stesso e può essere annidato.