サブシェルを起動してコマンドを実行します。

サブシェルを起動してコマンドを実行します。

常に対話型シェルで実行されるスクリプトがあるとします。私はこのスクリプトが親のコピーであるインタラクティブなサブシェルを起動し(つまり、すべての環境変数などを保持する)、任意のコマンドを実行したいと思います(具体的にはいくつかのPS1エイリアスを変更して定義したい)。実際のサブシェルが必要です(1つを使用する代わりにsource、そうでなければスクリプトが完了した後に環境変数は保持されません)。そしてシェルに拘束されるべきではありません(例:bash、zshなどで使用)。

これまで私がこれを行うことができた唯一の方法は、次のものを使用することですexpect。少し怖いですが動作します。

expect <(cat <<-EXPECT
  spawn $SHELL
  send "export FOO=\"$foo\"\r"
  send "PS1=\"(foo:$FOO) \\\$PS1\"\r"
  send "alias foo=\"do_somthing --foo=$FOO\"\r"
  send "clear\r"
  interact
EXPECT)

もっと良い方法がありますか? (また、このアプローチは画面の再描画と文字エンコードに問題があることを示しています。)

これを行う際の問題は、シェルのグローバルファイルとユーザーの.rcファイルがPS1="$foo" $SHELLそれらを上書きできることです。PS1カスタム.rcファイルを提供するシェルに拘束されない方法はないようです。

ベストアンサー1

おすすめ記事