私は次のようなものを実行したいと思います:
bash -c "some_program with its arguments"
ただし、インタラクティブbashがsome_program
終了した後も実行を続けるようにしてください。
-c
私はこれが良いアプローチではないと確信していますman bash
。
対話型シェルは、オプションではなく引数と-cオプションなしで始まります。
ではどうすればいいですか?
説明された主な目標ここ
ノート
some_program
随時終了する必要があります。- 背景に入れたくない
bash
私は残って別のことをしたい- プログラムを再実行したいです。
ベストアンサー1
以下は望ましいタスクを実行するより短い解決策ですが、問題とbashの仕組みを理解していない場合は意味がないかもしれません。
bash -i <<< 'some_program with its arguments; exec </dev/tty'
これにより bash シェルが起動し、some_program
終了時にsome_program
対話型シェルが起動します。
基本的に私たちがすることは、bashのSTDINに文字列を入力することです。この文字列はbashに起動しsome_program
て実行するように指示しますexec </dev/tty
。exec </dev/tty
Bashに私たちが提供した文字列からSTDINを切り替えるように指示して/dev/tty
対話型にします。
これは、-i
bashの起動時にSTDINがttyであることを確認しますが、bashの起動時にはそうではないためです。しかし、これからはそうするので、bashをインタラクティブモードに強制します。
別のソリューション
私が考えるために移植性が非常に良いもう一つのアイデアは、ファイルの末尾に以下を追加することです~/.bashrc
。
if [[ -n "START_COMMAND" ]]; then
start_command="$START_COMMAND"
unset START_COMMAND
eval "$start_command"
fi
次に、まずコマンドでシェルを起動するには、次のようにします。
START_COMMAND='some_program with its arguments' bash
説明する:
ほとんどは明らかですが、変数名が変更される理由は、変数をローカライズできるからです。変数がエクスポートされるため、シェル$START_COMMAND
のすべての子孫から継承されます。他のbashシェルがこれらの子孫の1つである場合は、コマンドを再実行します。したがって、エクスポートされていない新しい変数($start_command
)に値を割り当て、古い変数を削除します。