コマンドが実行された後でもBashを実行し続けるには?

コマンドが実行された後でもBashを実行し続けるには?

私は次のようなものを実行したいと思います:

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/ttyexec </dev/ttyBashに私たちが提供した文字列からSTDINを切り替えるように指示して/dev/tty対話型にします。

これは、-ibashの起動時に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)に値を割り当て、古い変数を削除します。

おすすめ記事