
常に対話型シェルで実行されるスクリプトがあるとします。私はこのスクリプトが親のコピーであるインタラクティブなサブシェルを起動し(つまり、すべての環境変数などを保持する)、任意のコマンドを実行したいと思います(具体的にはいくつかの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ファイルを提供するシェルに拘束されない方法はないようです。