現在のシェルで何かを実行する方法

現在のシェルで何かを実行する方法

現在のシェルで実行できる 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

関連情報