Tengo un script en el que no quiero que llame exitsi se está buscando.
Pensé en comprobar si $0 == bashesto 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_SOURCEes 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$0en este caso, pero tampoco duelen. ;)$arrayobtienes${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/shen 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
returndeclaraciones solo de funciones y, en el ámbito de nivel superior de un script, solo si el script tiene su origen .returnse 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 ejecutareturnen 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 lasourcedvariable en consecuencia.returnen el ámbito de nivel superior de un script de origen saldría del script.0comoreturnoperando; 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,
$0y${.sh.file}NO se garantiza que sean exactamente idénticos en el caso sin origen, ya que$0puede ser una ruta relativa , aunque${.sh.file}siempre es una ruta completa , por lo que$0debe resolverse en una ruta completa antes de comparar.zsh
$ZSH_EVAL_CONTEXTcontiene 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_CONTEXTtermina con:file.Advertencia: Dentro de una sustitución de orden, APPENDs zsh
:cmdsubst, por lo que la prueba$ZSH_EVAL_CONTEXTde: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
shcompatibleify agregando un controlador para otras conchas).[1] user1902689 descubrió que
[[ $0 != "$BASH_SOURCE" ]]produce un falso positivo cuando ejecuta un script ubicado en al$PATHpasar su simple nombre de archivo albashbinario; por ejemplo,bash my-scriptporque$0es justomy-script, mientras que$BASH_SOURCEes 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-xde 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
sourcelugar, 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
$_ == $0comparació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
-xbandera: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
$SECONDSesté 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.shes un Bash-ism y no es portátil,. somescript.shes 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
callerlos valoresmainysourcedistinguir el contexto del llamante. El uso leFUNCNAME[]ahorra capturar y analizarcallerresultados. 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. (FUNCNAMEes 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
bashidioma 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,
returndevolverá un error (redirigido) yexitfinalizará el script de la forma habitual. Ambosreturnyexitpueden 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 tratareturncomo equivalente aexitsi se invoca fuera de una función o script de origen de punto.Actualizado : lo que puede hacer en las versiones contemporáneas
kshes verificar la variable especial.sh.levelque 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
kshfunción de disciplina y algunos trucos de trampa de depuración para emular laFUNCNAMEmatriz 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_COMMANDconjunto, eso aparece como el último índice de laFUNCNAMEmatriz si ejecutosource sourcetest.sh. La inversión de la verificación (en busca demainque el último índice) parece más robusto:is_main() { [[ ${FUNCNAME[@]: -1} == "main" ]]; }.FUNCNAMEsolo están disponibles en funciones. Según mis pruebas condeclare -p FUNCNAME, sebashcomporta de manera diferente. v4.3 da un error fuera de las funciones, mientras que v4.4 dadeclare -a FUNCNAME. Ambos (!) De retornomainpara${FUNCNAME[0]}en el script principal (si se ejecuta), mientras que$FUNCNAMEno da nada. Y: Hay tantos scripts por ahí "ab" que usan$BASH_SOURCEfunciones 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
returndeclaració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
returndeclaració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
returndeclaración dentro de un sub-shell. Cuando lareturnsentencia 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.shThis script is sourced.$ ./test.shThis script is sourced.returndebe hacer en el nivel superior ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ). Eldashshell trata areturnen el nivel superior comoexit. Otros shells les gustabashozshno permitenreturnen 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 comoshen 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$).returnSi no se ejecuta un valor de retorno explícito, se rompensourcelas 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/bashdiferentes shells, pero también pueden obtenerse para obtener información (como la configuración) que se mantiene fuera de lamainfunció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_SOURCEen otros shells y permitirset -etrabajar enmain:Esta receta de script tiene las siguientes propiedades:
Si se ejecuta de
bashla manera normal,mainse llama. Tenga en cuenta que esto no incluye una llamada comobash -x script(dondescriptno contiene una ruta), consulte a continuación.Si se obtiene
bash,mainsolo 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-scriptdebe estar, lo quetestve como$BASH_SOURCE).Si se obtiene / ejecuta / lee /
evaled por un shell que no seabash,mainno se llama (BASH_SOURCEsiempre es diferente a$0).mainno se llama sibashlee la secuencia de comandos de stdin, a menos que establezca$0la cadena vacía de esta manera:( exec -a '' /bin/bash ) <scriptSi se evalúa con
bashwitheval(¡eval "`cat script`"todas las comillas son importantes! ) Desde algún otro script, esto llamamain. Sievalse ejecuta directamente desde la línea de comandos, esto es similar al caso anterior, donde el script se lee desde stdin. (BASH_SOURCEestá en blanco, mientras que, por lo$0general,/bin/bashno está obligado a algo completamente diferente).Si
mainno se llama, devuelvetrue($?=0).Esto no se basa en un comportamiento inesperado (anteriormente escribí indocumentado, pero no encontré documentación que
unsettampoco pueda modificarBASH_SOURCE):BASH_SOURCEes 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_SOURCEfuncione fuera de las funciones. Sin embargo, lo contrario (que solo funciona en funciones) tampoco está documentado. La observación es que funciona (probado conbashv4.3 y v4.4, desafortunadamente ya no tengobashv3.x) y que demasiados scripts se romperían si$BASH_SOURCEdeja de funcionar como se observa. Por lo tanto, mi expectativa es que seBASH_SOURCEmantenga igual que para las futuras versiones debash.( return 0 ), lo que da0si es de origen y1si no lo es. Esto es un poco inesperado, no solo para mí , y (de acuerdo con las lecturas allí) POSIX dice que esoreturnde subshell es un comportamiento indefinido (y elreturnaquí 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 algunabashversión futura cambie accidentalmente el comportamiento de retorno en ese caso.Lamentablemente
bash -x script 1 2 3no se ejecutamain. (Compararscript 1 2 3dondescriptno tiene camino). Lo siguiente puede usarse como solución alternativa:bash -x "`which script`" 1 2 3bash -xc '. script' "`which script`" 1 2 3bash script 1 2 3no semainpuede ejecutar como una característica.Tenga en cuenta que las
( exec -a none script )llamadasmain(bashno se transfieren$0al script, para esto debe usarlas-ccomo se muestra en el último punto).De este modo, a excepción de algunos algunos casos de esquina,
mainse 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
sourceing, 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/bashno está instalado o no funciona (es decir, E. en un entorno de arranque)curl https://example.com/script | $SHELLbashversió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
maina 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' | $SHELLNotas
¡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/shestá efectivamentebashen el modo POSIX, la asignaciónBASH_SOURCErompe 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.shllamadaam_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 integradasFUNCNAMEyBASH_SOURCE; vea su documentación en la página del manual bash.Solo dos advertencias:
1) la llamada a
am_I_calleddebe 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_calleddebe 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_ENVscript.La mejor manera que he encontrado es usarlo
$0así:Desafortunadamente, esta forma no funciona de manera
functionargzeropredeterminada 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 functionargzeromi.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.shfunciona bien para mí (con mi declaración): ¿qué versión estás usando?/proc/$$/cmdline) y se enfocadashsolo (que también actúa comoshUbuntu, por ejemplo). Si está dispuesto a hacer ciertas suposiciones, puede examinar$0una prueba razonable, pero incompleta, que sea portátil.sh/dashtambié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
callersalida, pero no creo que exista un equivalente en ksh.fuente
$0trabaja enbash,ksh93ypdksh. No tengoksh88que probar.Necesitaba un one-liner que funcionara en [mac, linux] con bash.version> = 3 y ninguna de estas respuestas se ajustaba perfectamente.
fuente
bashsolución funciona bien (podría simplificarse$BASH_SOURCE), pero lakshsolució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 -- ARGSpara ejecutar un script remoto sobre la marcha, los $ 0 serán solo enbashlugar de normales/bin/bashcuando 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
exportsolo asegúrese de que este mecanismo se pueda extender a subprocesos.fuente