2012-07-27 10 views
6

In bash ottengo il genitore nome della cartella dello script di esecuzione con questa lineaCome ottenere la cartella principale dell'esecuzione dello script in zsh?

SCRIPT_PARENT=`readlink -f ${BASH_SOURCE%/*}/..` 

Esiste un modo per raggiungere questo obiettivo in zsh in un modo che funziona sia in zsh e bash?

Assumere Ho un file di /some/folder/rootfolder/subfolder/script con il contenuto:

echo `magic-i-am-looking-for` 

voglio che si comportano in questo modo:

$ cd /some/other/folder 
$ . /some/folder/rootfolder/subfolder/script 
/some/folder/rootfolder 
$ . ../../folder/rootfolder/subfolder/script 
/some/folder/rootfolder 
$ cd /some/folder/rootfolder 
$ . subfolder/script 
/some/folder/rootfolder 
$ cd subfolder 
$ . script 
/some/folder/rootfolder 

Questo dovrebbe funzionare in bash e zsh. Il mio primo implementa questo comportamento, ma a causa di $BASH_SOURCE non funziona in zsh.

Quindi, in pratica la sua:

Esiste un modo per emulare $BASH_SOURCE in zsh, che funziona anche in bash?

+1

Fornire esempi con le uscite previste – shkschneider

risposta

8

Ora mi sono reso conto che $0 in zsh si comporta come $BASH_SOURCE in bash.Quindi, utilizzando $BASH_SOURCE quando disponibile e cadere di nuovo al $0 risolve il mio problema:

${BASH_SOURCE:-$0} 

C'è un po 'caso limite zsh sinistra, nell'acquisto di da $PATH come:

zsh> cat ../script 
echo \$0: $0 
echo \$BASH_SOURCE: $BASH_SOURCE 
echo '${BASH_SOURCE:-$0}:' ${BASH_SOURCE:-$0} 
zsh> . script 
$0: script 
$BASH_SOURCE: 
${BASH_SOURCE:-$0}: script 
bash> . script 
$0: bash 
$BASH_SOURCE: /home/me/script 
${BASH_SOURCE:-$0}: /home/me/script 

ho potuto fare un which script ma questo non suonerebbe bene con altri casi

+1

si prega di fare riferimento alla mia risposta: http://stackoverflow.com/questions/9901210/bash-source0-equivalent-in-zsh/23259585#23259585 –

0

Perché eri in grado di eseguire il comando da $ PATH farò qualcosa di simile:

SCRIPT_PARENT=$(readlink -f "$(which $0)/..") 

È questa la tua uscita desiderata?

+0

Il comando non è necessariamente sul percorso. E funzionerà anche se lo script è originario nella shell. –

5

Mentre sarebbe facile farlo in zsh, è altrettanto facile usare pure bash che può essere valutato in zsh. Se non è possibile utilizzare qualsiasi comando che può o non può essere sul vostro percorso, quindi è possibile utilizzare solo l'alterazione variabile per ottenere quello che vuoi:

SCRIPT_SOURCE=${0%/*} 

Questa è probabile che sia un percorso relativo. Se si vuole veramente il percorso completo, allora si dovrà ricorrere ad un comando esterno (si potrebbe implementare da soli, ma sarebbe un sacco di lavoro per evitare di utilizzare un comando molto disponibile):

SCRIPT_SOURCE=$(/bin/readlink -f ${0%/*}) 

Questo non dipende dal tuo $ PATH, dipende solo dalla presenza di/bin/readlink. Che quasi certamente è.

Ora, si voleva che questo fosse un file di origine. Questo va bene, dato che puoi esportare qualsiasi variabile impostata, tuttavia se esegui quanto sopra, $ 0 sarà la posizione del file originario e non la posizione dello script chiamante.

Ciò significa che è necessario impostare una variabile per contenere il valore $ 0 che lo script di origine conosce. Per esempio:

Lo script sarà fonte:

echo ${LOCATION%/*} 

Lo script che le fonti che lo script:

LOCATION=$0 
<source script here> 

Ma dato che il $ {0%/*} espansione è così compatto, potresti usarlo al posto della sceneggiatura.

+0

Hai ragione: '$ 0' è la risposta per zsh. Sfortunatamente si comporta diversamente in bash quando sourcing come bash non imposta '$ 0' –

Problemi correlati