2013-08-01 22 views
60

Voglio solo capire la seguente riga di codice nella shell. È usato per ottenere la directory di lavoro corrente. Sono a conoscenza del fatto che il nome $(variable) restituisce il valore all'interno del nome della variabile, ma cosa deve restituire $(command)? Restituisce il valore dopo l'esecuzione del comando? In tal caso, è possibile utilizzare ` per eseguire il comando.

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

stessa uscita può essere preso dalla seguente riga di codice anche in versione diversa del guscio

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

non sono in grado di comprendere il significato di $(cd.. e $(dirname.

Qualcuno potrebbe aiutarmi a capire come viene eseguito questo comando?

+1

E qui c'è una domanda sui vantaggi/svantaggi di '$()' contro '\' \ '': http://stackoverflow.com/questions/9449778/che-è-il-benefit-of- usando-invece-di-backtick-in-shell-script –

risposta

65

L'utilizzo di $ come ${HOME} fornisce il valore di HOME. L'utilizzo di $ come $(echo foo) significa eseguire qualunque cosa si trovi all'interno delle parentesi in una subshell e restituirla come valore. Nel mio esempio, si otterrebbe foo dal echo scriverà foo allo standard out

+6

stessa cosa fatta da \ 'echo foo \', sono corretto? – KItis

+25

Sì; '$ (...)' è un modo migliore di scrivere un comando piuttosto che provare a usare le virgolette. Prendi in considerazione la scrittura: 'gcclib = $ (dirname $ (dirname $ (which gcc)))/lib' usando back quotes. Anche prima di entrare nelle difficoltà di farlo in Markdown, è più difficile perché devi sfuggire alle backquote dei comandi nidificati, mentre non con la notazione '$ (...)'. –

+6

Tecnicamente, '$ (echo foo)' crea una sostituzione di comando, non una subshell. L'altra risposta attuale ha ragione. Penso che la sostituzione dei comandi sia eseguita in una subshell, una sorta di, ma sono ancora concetti diversi. – trysis

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

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

Vediamo diverse parti del comando. BASH_SOURCE è una variabile dell'array bash contenente i nomi file di origine. Quindi "${BASH_SOURCE[0]}" ti restituirebbe il nome del file di script.

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

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

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

+0

Ci scusiamo per 3 anni di ritardo alla festa, ma potresti spiegare * perché * la dichiarazione funziona? Hai detto 'dirname' restituisce il percorso del file eseguito (relativo o assoluto alla presente directory di lavoro),' cd' cambia il pwd in quella directory, e 'pwd' stampa il percorso assoluto della directory di lavoro corrente. Ma perché sono uniti da '&&'? E cosa mancherà 'DIR' se il' cd' fallisce? – Christian

Problemi correlati