web-dev-qa-db-ja.com

bash:コマンドラインで指定されたコマンドを実行し、終了しないでください

〜/ .bashrcを読み取った後、新しいbash内で1回実行されるbashのコマンドラインでコマンドを指定するにはどうすればよいですか?しかし、コマンドの終了後にbashを終了させずにこれをすべて実行しますか?

terminator の「boot-up-configuration」をいじっています。ここで、いくつかの分割は、起動後にいくつかのアプリケーション(vim、mutt、irrsi)を起動する必要があります。しかし、私はまだバックグラウンドで通常のシェル(ctrl-zなど...)が必要なので、アプリケーションを終了した後、eapplicationsの存続期間中に持っていたのと同じシェルがあります...

私にとってうまくいかないこと(与えられた答えに基づく)

 ( bash; vim )              # vim waits for the exit of bash...
 bash -c vim                # bash exits after vims exit...
 bash -c 'vim; exec bash'   # bash is executed _after_ vim... ctrl-z won't work
 echo vim | bash -s         # "Vim: Warning: Input is not from a terminal"     

一時的なbashrcに「vim」を手動で追加することも機能しません。 vimは正しく起動しますが、ctrl-zが表示されるバックグラウンドbashはまだありません。

助言がありますか?

13
marvin2k

ジョブ制御が機能するように、これを解決する方法を見つけたようです。

bash --rcfile <(cat $ {HOME} /。bashrc; echo'export Prompt_COMMAND = "vim; export Prompt_COMMAND =" ')-i

これにより、カスタムbashrcファイルがその場で作成され、Prompt_COMMAND変数を使用してVimの開始を遅らせ、ジョブ制御が機能するようにします。もちろん、これはVim固有ではないように一般化することができます。

さて、これをターミネーターでテストしたところ、少なくとも設定ファイルで動作するようです。

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export Prompt_COMMAND="vim; export Prompt_COMMAND="') -i"
4
wor
bash -c 'vim; exec bash'

exec bashは、現在のBashインスタンスを新しいインスタンスに置き換えます。

2
Michael Hoffman

(Ab).bashrcの使用は、のみ使用可能な方法です。1 ただし、生成は不要です。コマンドを環境変数に入れてevalするだけです。

  • ~/.bashrcの最後に次のように入力します。

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
    
  • このコマンドを開始するようにターミネーターを構成します。

    env startup_cmd='vim' bash
    

1 「C4を使ってナッツを割る」ものは除外しましょう。

2
user1686

Ctrl-zを出力する機能を備えたtmuxウィンドウでvimを生成したいという状況で、これと同じ問題が発生しました。結局、私はそれをバッシュの中できれいに行う方法を理解することができませんでした。私は次のことに決めました:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"
0
masher
bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 `</tmp/foo`; )' ) -i

カスタムbashrcファイルオンザフライ」のユーザーworに感謝します!

他の重要な部分は "trap"、bash-builtin:です。

  • 上記のtrapコマンドは、bashがシグナル12を受信した場合に実行されるvimを定義するだけです。
  • Rcfileの実行中にバックグラウンドに置かれると、潜んでいるkill -12コマンドが1秒間待機して、bashが初期化を完了できるようにします。これを省略すると、vim中にCtrl-Zを押すと、workingシェルになりません。
  • 次にkillが実行され、vimが開始されます。
  • killは、/ tmp/fooからプロセスIDを読み取ります。おそらくもっとエレガントな方法があります。
  • Ctrl-Zもテストしましたが、期待どおりに機能します。

ちなみに、あなたが言っている「ターミネーター」が何なのかわかりません。

Bashとscreenを使った解決策を探しているときにこれを見つけました。

0
klaus thorn