fish スクリプトはソースと実行を区別できますか?

fish スクリプトはソースと実行を区別できますか?

いくつかの変数をエクスポートし、最後にコマンドを起動する fish スクリプトがあります。このファイルをソースにして、これらの変数を現在のシェル セッションに取り込み、最後にコマンドを実行しないようにしたいと思います。

質問: 現在のファイルが実行中か、ファイル内からソース化されているかを確認できますか?

答え1

環境変数を使用して、$_スクリプトがコマンドによって「実行」されているかどうかを確認できますsource

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

答え2

$_環境変数を使用して、スクリプトがコマンドによって「実行」されているかどうかを確認できます。コマンドには共通のエイリアス (" ") があるため、との両方に対して環境変数をチェックする必要があることにsource注意してください。source.$_source.

#!/bin/fish

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

これの一般的な使用法としては、スクリプトがソース化されていない場合にユーザーに警告を出すことが挙げられます。

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

activate.fishもちろん、スクリプトの名前に置き換えてください。

答え3

スクリプトを「ソース」する意味を誤解していると思います。一般的に、スクリプトを実行すると、別のプロセスで実行されます。ソースすると、現在のシェル各行は引き続き実行されます。

おそらく、最後の行をフィルタリングしたいでしょう。以下を試してください:

source (sed '$d' filename | psub)

このpsubコマンドは、何らかのプロセスの出力をファイルであるかのように処理するために使用されます。ドキュメンテーション

関連情報