2012-07-27 6 views
6

En bash me sale el nombre de la carpeta principal de la escritura de ejecución por esta línea¿Cómo obtener la carpeta principal para ejecutar el script en zsh?

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

¿Hay alguna manera de lograr esto en zsh de una manera que funciona tanto en zsh y bash?

asume que tengo un archivo con el contenido /some/folder/rootfolder/subfolder/script:

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

quiero que se comporte de esta manera:

$ 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 

Esto debería funcionar en bash y zsh. La primera implementa este comportamiento, pero debido a $BASH_SOURCE no funciona en zsh.

Así que básicamente es:

¿Hay una manera de emular $BASH_SOURCE en zsh, que también trabaja en bash?

+1

Indique ejemplos con las salidas esperadas – shkschneider

Respuesta

8

Ahora me di cuenta de que $0 en zsh se comporta como $BASH_SOURCE en bash.Así, utilizando $BASH_SOURCE cuando esté disponible y cayendo de nuevo a $0 resuelve mi problema:

${BASH_SOURCE:-$0} 

Hay una pequeña caso extremo zsh la izquierda, en caso de procurarse de $PATH como:

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 

que podía hacer un which script pero esto no funcionaría bien con otros casos

+1

por favor refiérase a mi respuesta: http://stackoverflow.com/questions/9901210/bash-source0-equivalent-in-zsh/23259585#23259585 –

0

Debido a que fueron capaces de ejecutar el comando de $ PATH voy a hacer algo así:

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

Es que su salida deseada?

+0

El comando no está necesariamente en la ruta. Y también funcionará si el script se origina en el shell. –

5

Si bien sería fácil hacer esto en zsh, es igual de fácil utilizar pure bash que se puede evaluar en zsh. Si no puede utilizar cualquier comando que pueden o no estar en su camino, entonces sólo se puede usar alteración variable para lograr lo que quiere:

SCRIPT_SOURCE=${0%/*} 

Ésta es probable que sea una ruta relativa. Si realmente desea que la ruta completa a continuación, tendrá que recurrir a un comando externo (que podría aplicar por sí mismo, pero sería mucho trabajo para evitar el uso de un comando muy disponible):

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

Esto no depende de tu $ PATH, solo depende de que esté presente/bin/readlink. Lo cual es casi seguro.

Ahora, usted quería que este fuera un archivo de origen. Esto está bien, ya que solo puede exportar cualquier variable que establezca; sin embargo, si ejecuta lo anterior, entonces $ 0 será la ubicación del archivo de origen y no la ubicación del script de llamada.

Esto solo significa que necesita establecer una variable para mantener el valor de $ 0 que conoce el script de origen. Por ejemplo:

La secuencia de comandos que se usa como fuente:

echo ${LOCATION%/*} 

El guión que las fuentes de esa secuencia de comandos:

LOCATION=$0 
<source script here> 

Pero dado que el $ {0%/*} expansión es tan compacto, podrías usar eso en lugar del guión.

+0

Tiene razón: '$ 0' es la respuesta para zsh. Desafortunadamente se comporta diferente en bash cuando el abastecimiento como bash no establece '$ 0' –

Cuestiones relacionadas