すぐにシャットダウンせずにサブシェルから特定のコマンドを実行できますか?

すぐにシャットダウンせずにサブシェルから特定のコマンドを実行できますか?

私は使う魚の皮そして、魚が読めない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 .特別なプロパティ特別な組み込み機能。

bashshPOSIXモード(GNUプロジェクトの実装)ではない場合の動作はこれに関して異なります(asとshnor withが呼び出されず、--posix環境にPOSIXLY_CORRECT=norが含まれていない場合SHELLOPTS=posix)。

bash.失敗した場合、シェルは終了しません$PATH

vars.shとにかく、POSIXモードにかかわらず、現在のディレクトリにある場合は./vars.sh構文が必要です。だからそうです

exec sh -c 'command . ./vars.sh; exec fish'

答え2

個人的には別のアプローチをとります。それはおそらく他の理由でBourne型のフォーマットファイルを必要とするでしょう。形式を動的に変更して魚からインポートするのはどうですか?それは次のとおりです。

source (sed -nr 's/(.+)=(.+)/set \1 \2/p' file | psub)

上記の魚は次のとおりです。

source <(sed -nr 's/(.+)=(.+)/set \1 \2/p' file)

たとえば、

> cat file
foo="baz"
export foo
> source (sed -nr 's/(.+)=(.+)/set \1 \2/p' | psub)
> echo $foo
baz

注:これは、ソーススクリプトが変数(質問に記載されているように)と1行に1つの変数定義のみを設定すると想定しています。より複雑な作業では、このアプローチは機能しません。

答え3

POSIX準拠のシェル言語を使用して環境変数を設定し、それをFishで使用したい特定の問題に対する既存のソリューションの1つは次のとおりです。ベース。これはterdonに似たスクリプトです。回答ただし、より極端なケースも処理できます。

関連情報