2012-03-24 11 views
10

Deseo saber cómo determinar si un archivo de script se ejecuta o se obtiene.Cómo determinar si un archivo de script de shell se obtiene en Bash

Por ejemplo,

# Shell script filename build.sh 
if [ "x$0" = "xbash" ]; then 
    echo "I am sourced by Bash" 
else 
    echo "I am executed by Bash" 
fi 

Si Mecanografié

source build.sh 

sería la salida estoy de origen por Bash.

Si Mecanografié

./build.sh 

Sería salida Estoy ejecutados por Bash.

Actualmente, uso $ 0 para hacer esto. ¿Hay una mejor idea?

Inspirado por Tripeee, he encontrado una mejor manera:

#!/bin/bash 

if [ "x$(awk -F/ '{print $NF}' <<< $0)" = 'xcdruntime' ]; then 
    echo Try to source me, not execute me. 
else 
    cd /opt/www/app/pepsi/protected/runtime 
fi 
+0

Su solución no funciona, ya que puede ejecutar un script a través de 'bash build.sh'. También tenga en cuenta que un script se puede encargar, es algo estúpido, pero posible. – user123444555621

+0

@ Pumbaa80 eh ... He intentado 'bash build.sh' mi solución aún funciona – hellojinjie

+0

Ah, no lo olvides;) – user123444555621

Respuesta

9

No funciona si proceden de otro guión. Yo iría al revés;

test "X$(basename -- "$0")" = "Xbuild.sh" || echo Being sourced 

Actualización: añadido X prefix a ambas cadenas.

Actualización también: añadido doble guión a basename invocación.

+0

Yeh, Tu sensación es mejor que la mía. Si el script proviene de otro script, $ 0 no será 'bash' – hellojinjie

+0

Tengo que decir que su solución no es la mejor, funciona bien en ubuntu, pero falló en Enterprise Linux 5. En ubuntu, cuando fuente a el archivo de script, $ 0 es 'bash', mientras que en EL5, el $ 0 es' -bash'. cuando basename met-bash, ocurre un error – hellojinjie

+1

Ooops, tienes razón. Actualizado mi respuesta. Gracias por sus comentarios. – tripleee

Cuestiones relacionadas