Tengo un script en el que no quiero que llame exit
si se está buscando.
Pensé en comprobar si $0 == bash
esto tiene problemas si el script proviene de otro script o si el usuario lo obtiene de un shell diferente ksh
.
¿Hay alguna forma confiable de detectar si se está obteniendo un script?
Respuestas:
Esto parece ser portátil entre Bash y Korn:
Una línea similar a esta o una tarea como
pathname="$_"
(con una prueba y acción posterior) debe estar en la primera línea del guión o en la línea después del shebang (que, si se usa, debe ser para ksh para que funcione bajo La mayoría de las circunstancias).fuente
BASH_ENV
,$_
en la parte superior del script se ejecutará el último comandoBASH_ENV
.$_
es un problema.bash script
(invocación a través del ejecutable del shell, que esta solución informa erróneamente como fuente ), y (b) (mucho menos probable)echo bash; . script
(si$_
coincide con el shell que origina el script, esta solución lo informa erróneamente como una subshell ). Solo las variables especiales específicas de shell (por ejemplo,$BASH_SOURCE
) permiten soluciones robustas (se deduce que no existe una solución robusta compatible con POSIX). Se es posible, aunque engorroso, para elaborar una prueba cruzada shell robusto.Si su versión de Bash conoce la variable de matriz BASH_SOURCE, intente algo como:
fuente
${BASH_SOURCE[0]}
lugar de solo$BASH_SOURCE
? Y${0}
vs$0
?BASH_SOURCE
es una variable de matriz (consulte el manual ) que contiene un seguimiento de pila de fuentes, donde${BASH_SOURCE[0]}
es la última. Las llaves se usan aquí para decirle a bash qué es parte del nombre de la variable. No son necesarios$0
en este caso, pero tampoco duelen. ;)$array
obtienes${array[0]}
por defecto. Entonces, de nuevo, ¿hay alguna razón [...]?Soluciones sólidas para
bash
,ksh
,zsh
, incluyendo una cruz-shell uno, además de una solución compatible con POSIX razonablemente robusto :Los números de versión dados son los más funcionalidad en el que se verifica - probable es que estas soluciones funcionan en las versiones anteriores tanto, también - la retroalimentación de bienvenida .
Usando solo las características de POSIX (como en
dash
, que actúa como/bin/sh
en Ubuntu), no hay una manera sólida de determinar si se está obteniendo un script; consulte a continuación la mejor aproximación .Siguen una frase : la explicación a continuación; la versión cross-shell es compleja, pero debería funcionar de manera robusta:
bash (verificado en 3.57 y 4.4.19)
ksh (verificado en 93u +)
zsh (verificado en 5.0.5): asegúrese de llamar a esto fuera de una función
cross-shell (bash, ksh, zsh)
Compatible con POSIX ; No es una línea (tubería única) por razones técnicas y no es completamente robusta (ver abajo):
Explicación:
intento
Nota: La técnica se adaptó de la respuesta del usuario5754163 , ya que resultó ser más robusta que la solución original,
[[ $0 != "$BASH_SOURCE" ]] && sourced=1 || sourced=0
[1]Bash permite
return
declaraciones solo de funciones y, en el ámbito de nivel superior de un script, solo si el script tiene su origen .return
se usa en el ámbito de nivel superior de un script sin fuente , se emite un mensaje de error y el código de salida se establece en1
.(return 0 2>/dev/null)
se ejecutareturn
en una subshell y suprime el mensaje de error; luego, el código de salida indica si la secuencia de comandos se obtuvo (0
) o no (1
), que se utiliza con los operadores&&
y||
para establecer lasourced
variable en consecuencia.return
en el ámbito de nivel superior de un script de origen saldría del script.0
comoreturn
operando; señala: por bash ayuda dereturn [N]
: "Si se omite N, el estado de retorno es el del último comando". Como resultado, la versión anterior [que se usaba simplementereturn
, sin un operando] produce un resultado incorrecto si el último comando en el shell del usuario tiene un valor de retorno distinto de cero.ksh
La variable especial
${.sh.file}
es algo análoga a$BASH_SOURCE
; tenga en cuenta que${.sh.file}
causa un error de sintaxis en bash, zsh y dash, así que asegúrese de ejecutarlo condicionalmente en scripts de múltiples shell.A diferencia de bash,
$0
y${.sh.file}
NO se garantiza que sean exactamente idénticos en el caso sin origen, ya que$0
puede ser una ruta relativa , aunque${.sh.file}
siempre es una ruta completa , por lo que$0
debe resolverse en una ruta completa antes de comparar.zsh
$ZSH_EVAL_CONTEXT
contiene información sobre el contexto de evaluación; llame a esto fuera de una función. Dentro de una secuencia de comandos de origen [alcance de nivel superior],$ZSH_EVAL_CONTEXT
termina con:file
.Advertencia: Dentro de una sustitución de orden, APPENDs zsh
:cmdsubst
, por lo que la prueba$ZSH_EVAL_CONTEXT
de:file:cmdsubst$
allí.Usar solo las funciones de POSIX
Si está dispuesto a hacer ciertas suposiciones, puede hacer una suposición razonable, pero no infalible, de si su secuencia de comandos se obtiene, basándose en conocer los nombres de archivo binarios de los shells que pueden estar ejecutando su secuencia de comandos .
En particular, esto significa que este enfoque falla si su secuencia de comandos se obtiene de otra secuencia de comandos .
La sección "Cómo manejar las invocaciones de origen" en esta respuesta mía discute los casos extremos que no se pueden manejar con las características POSIX solo en detalle.
Esto se basa en el comportamiento estándar de
$0
, quezsh
, por ejemplo, no exhibe.Por lo tanto, el enfoque más seguro es combinar los métodos robustos específicos de la carcasa anteriores con una solución alternativa para todas las conchas restantes.
Punta del sombrero para Stéphane Desneux y su respuesta para la inspiración (transformando mi expresión de declaración de concha cruzada en una declaración
sh
compatibleif
y agregando un controlador para otras conchas).[1] user1902689 descubrió que
[[ $0 != "$BASH_SOURCE" ]]
produce un falso positivo cuando ejecuta un script ubicado en al$PATH
pasar su simple nombre de archivo albash
binario; por ejemplo,bash my-script
porque$0
es justomy-script
, mientras que$BASH_SOURCE
es la ruta completa . Mientras que normalmente no utilizar esta técnica para invocar los scripts en el$PATH
- que acababa de invocarlos directamente (my-script
) - que es muy útil cuando se combina con el-x
de la depuración .fuente
Después de leer la respuesta de @ DennisWilliamson, hay algunos problemas, ver a continuación:
Como esta pregunta representa ksh y intento, hay otra parte en esta respuesta sobre ksh... vea abajo.
Sencillo intento camino
Probemos (sobre la marcha porque esa fiesta podría ;-):
En su
source
lugar, uso off.
para facilitar la lectura (como.
es un aliassource
):Tenga en cuenta que el número de proceso no cambia mientras el proceso permanece en origen :
¿Por qué no usar la
$_ == $0
comparación?Para asegurar muchos casos, comienzo a escribir un script verdadero :
Copie esto a un archivo llamado
testscript
:Ahora podríamos probar:
Está bien.
Está bien.
Pero, para probar un script antes de agregar una
-x
bandera:O para usar variables predefinidas:
Esto ya no funcionará.
Mover el comentario de la 5ta línea a la 6ta daría una respuesta más legible:
Más fuerte: ksh ahora...
Como no uso ksh mucho, después de leer algo en la página del manual, están mis intentos:
Copia esto en un
testfile.ksh
:Que ejecutarlo dos veces:
y ver:
Hay alguna variable heredada en una ejecución de origen , pero nada realmente relacionado ...
Incluso podría verificar que
$SECONDS
esté cerca0.000
, pero eso garantiza que solo los casos de origen manual ...Incluso podría intentar verificar qué es el padre:
Coloque esto en su
testfile.ksh
:Que:
o
ps ho cmd $PPID
, pero esto funciona solo para un nivel de subsesiones ...Lo siento, no pude encontrar una manera confiable de hacerlo, bajo ksh.
fuente
[ "$0" = "$BASH_SOURCE" ] || [ -z "$BASH_SOURCE" ]
para scripts leídos a través de pipe (cat script | bash
)..
no es un aliassource
, en realidad es al revés.source somescript.sh
es un Bash-ism y no es portátil,. somescript.sh
es POSIX y IIRC portátil.La
BASH_SOURCE[]
respuesta (bash-3.0 y posterior) parece más simple, aunque noBASH_SOURCE[]
está documentada para trabajar fuera del cuerpo de una función (actualmente funciona, en desacuerdo con la página del manual).La forma más sólida, como lo sugiere Wirawan Purwanto, es verificar
FUNCNAME[1]
dentro de una función :Luego:
Esto es equivalente a verificar la salida de
caller
los valoresmain
ysource
distinguir el contexto del llamante. El uso leFUNCNAME[]
ahorra capturar y analizarcaller
resultados. Sin embargo, debe saber o calcular la profundidad de su llamada local para ser correcta. Casos como un script que se obtiene de otra función o script harán que la matriz (pila) sea más profunda. (FUNCNAME
es una variable de matriz de bash especial, debe tener índices contiguos correspondientes a la pila de llamadas, siempre que nunca sea asíunset
).(En bash-4.2 y versiones posteriores, puede utilizar la forma más simple
${FUNCNAME[-1]}
para el último elemento de la matriz. Mejorado y simplificado gracias al comentario de Dennis Williamson a continuación).Sin embargo, su problema como se indica es " Tengo un script en el que no quiero que llame a 'salir' si se está obteniendo ". El
bash
idioma común para esta situación es:Si la secuencia de comandos se obtiene
return
, la terminará y volverá a la persona que llama.Si el script se está ejecutando,
return
devolverá un error (redirigido) yexit
finalizará el script de la forma habitual. Ambosreturn
yexit
pueden tomar un código de salida, si es necesario.Lamentablemente, esto no funciona
ksh
(al menos no en la versión derivada de AT&T que tengo aquí), se tratareturn
como equivalente aexit
si se invoca fuera de una función o script de origen de punto.Actualizado : lo que puede hacer en las versiones contemporáneas
ksh
es verificar la variable especial.sh.level
que se establece en la profundidad de la llamada a la función. Para una secuencia de comandos invocada, esto inicialmente no se establecerá, para una secuencia de comandos de origen de punto se establecerá en 1.Esto no es tan robusto como la versión bash, debe invocar
issourced()
en el archivo que está probando en el nivel superior o en una profundidad de función conocida.(También puede estar interesado en este código en github que utiliza una
ksh
función de disciplina y algunos trucos de trampa de depuración para emular laFUNCNAME
matriz bash ).La respuesta canónica aquí: http://mywiki.wooledge.org/BashFAQ/109 también se ofrece
$-
como otro indicador (aunque imperfecto) del estado de shell.Notas:
FUNCNAME[]
pero siempre que solo se pruebe el último elemento de esa matriz no hay ambigüedad.pdksh
. Lo más cercano que puedo encontrar se aplica solopdksh
, donde cada fuente de un script abre un nuevo descriptor de archivo (comenzando con 10 para el script original). Casi seguro que no es algo en lo que quieras confiar ...fuente
${FUNCNAME[(( ${#FUNCNAME[@]} - 1 ))]}
obtener el último elemento (inferior) en la pila? Entonces, probar contra "main" (negar para OP) fue lo más confiable para mí.PROMPT_COMMAND
conjunto, eso aparece como el último índice de laFUNCNAME
matriz si ejecutosource sourcetest.sh
. La inversión de la verificación (en busca demain
que el último índice) parece más robusto:is_main() { [[ ${FUNCNAME[@]: -1} == "main" ]]; }
.FUNCNAME
solo están disponibles en funciones. Según mis pruebas condeclare -p FUNCNAME
, sebash
comporta de manera diferente. v4.3 da un error fuera de las funciones, mientras que v4.4 dadeclare -a FUNCNAME
. Ambos (!) De retornomain
para${FUNCNAME[0]}
en el script principal (si se ejecuta), mientras que$FUNCNAME
no da nada. Y: Hay tantos scripts por ahí "ab" que usan$BASH_SOURCE
funciones externas, que dudo que esto pueda o cambie.Nota del editor: la solución de esta respuesta funciona de manera sólida, pero es solo
bash
. Se puede simplificar a(return 2>/dev/null)
.TL; DR
Intenta ejecutar una
return
declaración. Si el script no tiene origen, eso generará un error. Puede detectar ese error y proceder según lo necesite.Ponga esto en un archivo y llámelo, por ejemplo, test.sh:
Ejecútelo directamente:
Fuente:
Para mí, esto funciona en zsh y bash.
Explicación
La
return
declaración generará un error si intenta ejecutarlo fuera de una función o si el script no tiene origen. Pruebe esto desde un indicador de shell:No necesita ver ese mensaje de error, por lo que puede redirigir la salida a dev / null:
Ahora verifique el código de salida. 0 significa OK (no se produjeron errores), 1 significa que se produjo un error:
También desea ejecutar la
return
declaración dentro de un sub-shell. Cuando lareturn
sentencia lo ejecuta. . . bien . . . devoluciones. Si lo ejecuta en un sub-shell, saldrá de ese sub-shell, en lugar de regresar de su script. Para ejecutar en el sub-shell, envuélvalo en$(...)
:Ahora, puede ver el código de salida del sub-shell, que debería ser 1, porque se generó un error dentro del sub-shell:
fuente
$ readlink $(which sh)
dash
$ . test.sh
This script is sourced.
$ ./test.sh
This script is sourced.
return
debe hacer en el nivel superior ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ). Eldash
shell trata areturn
en el nivel superior comoexit
. Otros shells les gustabash
ozsh
no permitenreturn
en el nivel superior, que es la característica de una técnica como esta explota.$
antes de la subshell. Es decir, use en(return >/dev/null 2>&1)
lugar de$(return >/dev/null 2>&1)
, pero luego deja de funcionar en bash.dash
, donde esta solución no funciona, actúa comosh
en Ubuntu, por ejemplo, esta solución generalmente no funcionash
. La solución me funciona en Bash 3.2.57 y 4.4.5, con o sin el$
antes(...)
(aunque nunca hay una buena razón para ello$
).return
Si no se ejecuta un valor de retorno explícito, se rompensource
las secuencias de comandos justo después de un comando con una salida incorrecta. Propuso la edición de mejora.FWIW, después de leer todas las otras respuestas, se me ocurrió la siguiente solución:
Esto funciona para todos los scripts, que comienzan con
#!/bin/bash
diferentes shells, pero también pueden obtenerse para obtener información (como la configuración) que se mantiene fuera de lamain
función.En lugar de las últimas 2 líneas, puede usar el siguiente código (en mi opinión, menos legible) para no establecer
BASH_SOURCE
en otros shells y permitirset -e
trabajar enmain
:Esta receta de script tiene las siguientes propiedades:
Si se ejecuta de
bash
la manera normal,main
se llama. Tenga en cuenta que esto no incluye una llamada comobash -x script
(dondescript
no contiene una ruta), consulte a continuación.Si se obtiene
bash
,main
solo se llama, si el script de llamada tiene el mismo nombre. (Por ejemplo, si se origina a sí mismo o a través debash -c 'someotherscript "$@"' main-script args..
dóndemain-script
debe estar, lo quetest
ve como$BASH_SOURCE
).Si se obtiene / ejecuta / lee /
eval
ed por un shell que no seabash
,main
no se llama (BASH_SOURCE
siempre es diferente a$0
).main
no se llama sibash
lee la secuencia de comandos de stdin, a menos que establezca$0
la cadena vacía de esta manera:( exec -a '' /bin/bash ) <script
Si se evalúa con
bash
witheval
(¡eval "`cat script`"
todas las comillas son importantes! ) Desde algún otro script, esto llamamain
. Sieval
se ejecuta directamente desde la línea de comandos, esto es similar al caso anterior, donde el script se lee desde stdin. (BASH_SOURCE
está en blanco, mientras que, por lo$0
general,/bin/bash
no está obligado a algo completamente diferente).Si
main
no se llama, devuelvetrue
($?=0
).Esto no se basa en un comportamiento inesperado (anteriormente escribí indocumentado, pero no encontré documentación que
unset
tampoco pueda modificarBASH_SOURCE
):BASH_SOURCE
es una matriz reservada de bash . Pero permitirBASH_SOURCE=".$0"
cambiarlo abriría una lata de gusanos muy peligrosa, por lo que mi expectativa es que esto no debe tener efecto (excepto, tal vez, alguna advertencia fea aparece en alguna versión futura debash
).BASH_SOURCE
funcione fuera de las funciones. Sin embargo, lo contrario (que solo funciona en funciones) tampoco está documentado. La observación es que funciona (probado conbash
v4.3 y v4.4, desafortunadamente ya no tengobash
v3.x) y que demasiados scripts se romperían si$BASH_SOURCE
deja de funcionar como se observa. Por lo tanto, mi expectativa es que seBASH_SOURCE
mantenga igual que para las futuras versiones debash
.( return 0 )
, lo que da0
si es de origen y1
si no lo es. Esto es un poco inesperado, no solo para mí , y (de acuerdo con las lecturas allí) POSIX dice que esoreturn
de subshell es un comportamiento indefinido (y elreturn
aquí es claramente de un subshell). Quizás esta característica finalmente tenga un uso generalizado suficiente para que ya no se pueda cambiar, pero AFAICS existe una posibilidad mucho mayor de que algunabash
versión futura cambie accidentalmente el comportamiento de retorno en ese caso.Lamentablemente
bash -x script 1 2 3
no se ejecutamain
. (Compararscript 1 2 3
dondescript
no tiene camino). Lo siguiente puede usarse como solución alternativa:bash -x "`which script`" 1 2 3
bash -xc '. script' "`which script`" 1 2 3
bash script 1 2 3
no semain
puede ejecutar como una característica.Tenga en cuenta que las
( exec -a none script )
llamadasmain
(bash
no se transfieren$0
al script, para esto debe usarlas-c
como se muestra en el último punto).De este modo, a excepción de algunos algunos casos de esquina,
main
se llama solamente, cuando el script se ejecuta de la forma habitual. Normalmente esto es lo que desea, especialmente porque carece de código complejo difícil de entender.¿Por qué creo que esta es una buena forma general de resolver el desafío?
Si tiene algo, que puede obtenerse mediante múltiples shells, debe ser compatible. Sin embargo (lea las otras respuestas), ya que no hay una forma portátil (fácil de implementar) para detectar el
source
ing, debe cambiar las reglas .Al hacer cumplir que el script debe ser ejecutado
/bin/bash
, usted hace exactamente esto.Esto resuelve todos los casos, pero a continuación, en cuyo caso el script no puede ejecutarse directamente:
/bin/bash
no está instalado o no funciona (es decir, E. en un entorno de arranque)curl https://example.com/script | $SHELL
bash
versión es lo suficientemente reciente. Se informa que esta receta falla para ciertas variantes. Por lo tanto, asegúrese de verificar que funcione para su caso).Sin embargo, ¡no puedo pensar en ninguna razón real en la que lo necesite y también en la capacidad de obtener exactamente el mismo script en paralelo! Por lo general, puede envolverlo para ejecutarlo
main
a mano. Como eso:$SHELL -c '. script && main'
{ curl https://example.com/script && echo && echo main; } | $SHELL
$SHELL -c 'eval "`curl https://example.com/script`" && main'
echo 'eval "`curl https://example.com/script`" && main' | $SHELL
Notas
¡Esta respuesta no hubiera sido posible sin la ayuda de todas las otras respuestas! Incluso los incorrectos, lo que inicialmente me hizo publicar esto.
Actualización: Editado debido a los nuevos descubrimientos encontrados en https://stackoverflow.com/a/28776166/490291
fuente
/bin/sh
está efectivamentebash
en el modo POSIX, la asignaciónBASH_SOURCE
rompe el script. En otras conchas (dash
,ksh
,zsh
), invocando el script pasándolo como un argumento de archivo directamente a los ejecutables de concha mal funcionamiento (por ejemplo,zsh <your-script>
hará que su escritura creer equivocadamente que es de origen ). (Ya que mencionas tubería de un mal funcionamiento del código, en todas las conchas.). <your-script>
(el abastecimiento) funciona en principio en todos los shells tipo POSIX, solo tiene sentido si el script fue escrito explícitamente para usar solo las características de POSIX, para evitar que las características específicas de un shell rompan la ejecución en otras conchas; Por lo tanto, usar una línea Bash shebang (en lugar de#!/bin/sh
) es confuso, al menos sin un comentario llamativo. Por el contrario, si su script está destinado a ejecutarse solo desde Bash (incluso si no se considera qué características pueden no ser portátiles), es mejor rechazar la ejecución en shells que no sean Bash.main
, ¡pero lo hace en este caso! Y cuando se obtiene/bin/sh
, es decirbash --posix
, lo mismo sucede en este caso, y eso también es completamente incorrecto.Esto funciona más adelante en el script y no depende de la variable _:
o
fuente
Daré una respuesta específica de BASH. Korn shell, lo siento. Supongamos que su nombre de script es
include2.sh
; luego haga una función dentro de lainclude2.sh
llamadaam_I_sourced
. Aquí está mi versión demo deinclude2.sh
:Ahora intenta ejecutarlo de muchas maneras:
Así que esto funciona sin excepción, y no está usando las
$_
cosas frágiles . Este truco utiliza la función de introspección de BASH, es decir, variables integradasFUNCNAME
yBASH_SOURCE
; vea su documentación en la página del manual bash.Solo dos advertencias:
1) la llamada a
am_I_called
debe llevarse a cabo en el script de origen, pero no dentro de ninguna función, para no${FUNCNAME[1]}
devolver otra cosa. Sí ... podrías haberlo comprobado${FUNCNAME[2]}
, pero solo haces tu vida más difícil.2) la función
am_I_called
debe residir en el script de origen si desea saber cuál es el nombre del archivo que se incluye.fuente
Me gustaría sugerir una pequeña corrección a la muy útil respuesta de Dennis , para que sea un poco más portátil, espero:
porque
[[
no es reconocida por la (algo anal retentivo mi humilde opinión) Debian POSIX compatible cáscara,dash
. Además, uno puede necesitar las comillas para protegerse contra los nombres de archivo que contienen espacios, nuevamente en dicho shell.fuente
$_
Es bastante frágil. Tienes que marcarlo como lo primero que haces en el script. E incluso entonces, no se garantiza que contenga el nombre de su shell (si se obtiene) o el nombre del script (si se ejecuta).Por ejemplo, si el usuario ha configurado
BASH_ENV
, entonces en la parte superior de un script,$_
contiene el nombre del último comando ejecutado en elBASH_ENV
script.La mejor manera que he encontrado es usarlo
$0
así:Desafortunadamente, esta forma no funciona de manera
functionargzero
predeterminada en zsh debido a que la opción hace más de lo que su nombre sugiere y está activada de manera predeterminada.Para evitar esto, puse
unsetopt functionargzero
mi.zshenv
.fuente
Seguí mklement0 expresión compacta .
Eso está bien, pero noté que puede fallar en el caso de ksh cuando se invoca así:
(piensa que es de origen y no es porque ejecuta una subshell) Pero la expresión funcionará para detectar esto:
Además, incluso si la expresión es compacta, la sintaxis no es compatible con todos los shells.
Así que terminé con el siguiente código, que funciona para bash, zsh, dash y ksh
Siéntase libre de agregar soporte de conchas exóticas :)
fuente
ksh 93+u
,ksh ./myscript.sh
funciona bien para mí (con mi declaración): ¿qué versión estás usando?/proc/$$/cmdline
) y se enfocadash
solo (que también actúa comosh
Ubuntu, por ejemplo). Si está dispuesto a hacer ciertas suposiciones, puede examinar$0
una prueba razonable, pero incompleta, que sea portátil.sh
/dash
también, en un anexo a mi respuesta.No creo que haya una forma portátil de hacer esto en ksh y bash. En bash, podría detectarlo usando la
caller
salida, pero no creo que exista un equivalente en ksh.fuente
$0
trabaja enbash
,ksh93
ypdksh
. No tengoksh88
que probar.Necesitaba un one-liner que funcionara en [mac, linux] con bash.version> = 3 y ninguna de estas respuestas se ajustaba perfectamente.
fuente
bash
solución funciona bien (podría simplificarse$BASH_SOURCE
), pero laksh
solución no es sólida: si su script está siendo obtenido por otro script , obtendrá un falso positivo.Directo al grano: debe evaluar si la variable "$ 0" es igual al nombre de su Shell.
Me gusta esto:
Vía SHELL :
VÍA FUENTE :
Es bastante difícil tener una forma 100% portátil de detectar si un script se originó o no.
Con respecto a mi experiencia (7 años con Shellscripting) , la única forma segura (no depender de las variables de entorno con PID, etc., que no es seguro debido a que es algo VARIABLE ), debe:
Ambas opciones no se pueden escalar automáticamente, pero es la forma más segura.
Por ejemplo:
cuando obtiene una secuencia de comandos a través de una sesión SSH, el valor devuelto por la variable "$ 0" (cuando se utiliza la fuente ) es -bash .
O
fuente
/bin/bash -c '. ./check_source.sh'
daThe script WAS NOT sourced.
. Mismo error:ln -s /bin/bash pumuckl; ./pumuckl -c '. ./check_source.sh'
->The script WAS NOT sourced.
Terminé revisando
[[ $_ == "$(type -p "$0")" ]]
Cuando se usa
curl ... | bash -s -- ARGS
para ejecutar un script remoto sobre la marcha, los $ 0 serán solo enbash
lugar de normales/bin/bash
cuando se ejecute el archivo de script real, por lo que usotype -p "$0"
para mostrar la ruta completa de bash.prueba:
fuente
Esta es una derivación de algunas otras respuestas, con respecto al soporte cruzado "universal". Esto es ciertamente muy similar a https://stackoverflow.com/a/2942183/3220983 en particular, aunque ligeramente diferente. La debilidad con esto es que un script de cliente debe respetar cómo usarlo (es decir, exportando primero una variable). La fortaleza es que esto es simple y debería funcionar "en cualquier lugar". Aquí hay una plantilla para su placer de cortar y pegar:
Nota: utilizo
export
solo asegúrese de que este mecanismo se pueda extender a subprocesos.fuente