現在のシェルで実行できる bash スクリプトまたは類似のものを作成したいと思います。
echo '#!/bin/bash
export foo="bar" ' > zoom.sh
しかし、このスクリプトを現在のプロセスで実行したい場合は、次のようになります。
exec ./zoom.sh
すると、ターミナルは「プロセスが完了しました」と終了するだけになり、 を使用してもset +e
、やはり終了します。
source
現在のシェルで何かを実行すると があるので、おそらく eval が最善策でしょうか? bash 関数は機能しますが、まず第一にeval
ユーザーに頼る必要があります。source
答え1
マニュアルによると、exec は新しいプロセスを作成せず、現在のシェルを置き換えるだけなので、実行後にセッションも終了するようです。
exec [-cl] [-a name] [command [arguments]]
:
command が指定されている場合は、それがシェルを置き換えます。新しいプロセスは作成されません。arguments は command の引数になります。-l オプションが指定されている場合は、シェルは command に渡される 0 番目の引数の先頭にダッシュを付けます。これは login(1) が行うことです。この-c
オプションにより、command は空の環境で実行されます。が-a
指定されている場合は、シェルは実行されるコマンドに 0 番目の引数として name を渡します。何らかの理由で command を実行できない場合、シェル オプションが有効になっていない限り、非対話型シェルは終了しますexecfail
。有効になっている場合は、失敗を返します。対話型シェルは、ファイルを実行できない場合は失敗を返します。command が指定されていない場合、リダイレクトは現在のシェルで有効になり、戻りステータスは 0 になります。リダイレクト エラーがある場合、戻りステータスは 1 になります。
$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed