私は使う魚の皮そして、魚が読めないsh互換の構文を使って書かれたいくつかのシェルスクリプトを「インポートする」ことを願っています。たとえば、多くのソフトウェアでは、便利な環境変数をエクスポートするためにいくつかのシェルスクリプトを取得すると期待しています。
# customvars.sh
FOOBAR=qwerty
export FOOBAR
ローカル変数と関数定義を保存することに興味がない場合は、execを使用して現在のプロセスを/ bin / shに置き換えてから釣りに戻す方法が1つあります。
# We start out on fish
exec /bin/sh
# Running a POSIX shell now
. customvars.sh
exec /usr/bin/fish
# Back on fish
echo $FOOBAR
このパターンをいくつかの関数に格納できるように1行に減らす方法はありますか?やろうとしたら
exec /bin/sh -c '. vars.sh; /usr/bin/fish'
インタラクティブな魚のプロンプトに戻ることなく、端末エミュレータウィンドウがすぐに閉じます。
ベストアンサー1
問題は、.
特別な組み込み関数を呼び出す方法です。
exec /bin/sh -c '. vars.sh; /usr/bin/fish'
でsh
引数にが含まれていない場合は、/
ファイル.
を検索します$PATH
。したがって、上記では予想どおりに現在のディレクトリの代わりに検索vars.sh
します$PATH
。
しかも.
、特別な組み込みエラーが原因でシェルが終了する(対話型でない場合)、次のコマンド(ここfish
)は実行されません。これがターミナルエミュレータウィンドウがプロンプトなしで消える理由ですfish
。
これは.
asを呼び出すことで防ぐことができますcommand .
。特別なプロパティ特別な組み込み機能。
bash
sh
POSIXモード(GNUプロジェクトの実装)ではない場合の動作はこれに関して異なります(asとsh
nor withが呼び出されず、--posix
環境にPOSIXLY_CORRECT=
norが含まれていない場合SHELLOPTS=posix
)。
bash
が.
失敗した場合、シェルは終了しません$PATH
。
vars.sh
とにかく、POSIXモードにかかわらず、現在のディレクトリにある場合は./vars.sh
構文が必要です。だからそうです
exec sh -c 'command . ./vars.sh; exec fish'