¿Puede un script de pescado distinguir entre ser obtenido y ejecutado?

¿Puede un script de pescado distinguir entre ser obtenido y ejecutado?

Tengo un script de pescado que exporta algunas variables y lanza un comando al final. Me gustaría poder obtener este archivo para incorporar estas variables a la sesión de shell actual, pero sin ejecutar el comando al final.

La pregunta: ¿Puedo saber si el archivo actual se está ejecutando o se obtiene desde dentro del archivo?

Respuesta1

Puede utilizar la $_variable de entorno para ver si el comando "ejecuta" su script source:

#!/bin/fish
if test "$_" = source
  echo got sourced
else
  echo was execed
end

Respuesta2

Puede utilizar la $_variable de entorno para ver si el comando "ejecuta" su script source. Tenga en cuenta que el sourcecomando tiene un alias común (" ."), por lo que debe comparar la $_variable de entorno con sourcey ..

#!/bin/fish

if test "$_" != "source" -a "$_" != "."
    echo "not sourced"
else
    echo "was sourced"
end

Un uso común de esto puede ser dar una advertencia al usuario, si el script no fue obtenido:

if test "$_" != "source" -a "$_" != "."
    echo "Run this script with \". ./activate.fish\" (aka: \"source ./activate.fish\")."
    exit 1
end

Reemplácelo activate.fishcon el nombre de su script, por supuesto.

Respuesta3

Creo que no entiendes lo que significa "obtener" un guión. Generalmente, ejecutar un script lo ejecutará en un proceso separado. Obtenerlo lo ejecutará en elcaparazón actual. Seguirá ejecutando cada línea.

Probablemente lo que quieras hacer es filtrar la última línea. Intentar:

source (sed '$d' filename | psub)

El psubcomando se utiliza para manejar la salida de algún proceso como si fuera un archivo.Documentación

información relacionada