Um script fish pode distinguir entre ser originado e executado?

Um script fish pode distinguir entre ser originado e executado?

Tenho um script fish que exporta algumas variáveis ​​e lança um comando no final. Eu gostaria de poder obter esse arquivo para trazer essas variáveis ​​para a sessão atual do shell, mas sem executar o comando no final.

A questão: Posso descobrir se o arquivo atual está sendo executado ou originado dentro do arquivo?

Responder1

Você pode usar a $_variável de ambiente para ver se o seu script está sendo “executado” pelo sourcecomando:

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

Responder2

Você pode usar a $_variável de ambiente para ver se o seu script está sendo “executado” pelo sourcecomando. Observe que o sourcecomando tem um alias comum (" ."), portanto você deve verificar a $_variável de ambiente em relação a sourcee ..

#!/bin/fish

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

Um uso comum disso pode ser avisar o usuário, se o script não tiver sido originado:

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

Substitua activate.fishpelo nome do seu script, é claro.

Responder3

Acho que você não entendeu o que a "fonte" de um script faz. Geralmente, a execução de um script o executará em um processo separado. Fornecê-lo irá executá-lo noshell atual. Ele ainda executará cada linha.

Provavelmente o que você deseja fazer é filtrar a última linha. Tentar:

source (sed '$d' filename | psub)

O psubcomando é usado para tratar a saída de algum processo como se fosse um arquivo.Documentação

informação relacionada