bash:コマンドラインで指定されたコマンドを実行し、終了しません


13

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

私は、起動後にいくつかの分割がいくつかのアプリケーション(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はまだありません。

助言がありますか?

回答:


4

ジョブコントロールが機能するように、これを解決する方法を見つけたようです。

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

これにより、カスタムbashrcファイルがオンザフライで作成され、PROMPT_COMMAND変数を使用してVimの起動が遅延し、ジョブ制御が機能します。もちろん、これはVim固有ではないように一般化できます。

OK、ターミネータでこれをテストしただけで、少なくとも設定ファイルで動作するようです:

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

どうもありがとう。しかし、私unset PROMPT_COMMANDはよりも好むexport PROMPT_COMMAND=
ペケ

2
bash -c 'vim; exec bash'

exec bash新しいものと現在のバッシュのインスタンスを置き換えます。


1
ええHM ...この解き「空のスプリット終了後に」問題...が、まだ動作しませんCTRL-Z - bashが単純に実行され、再び VIMS出口の後は...私はVimの必要は内部のbash
marvin2k

1
私はこのフォームを使用していますが、ちょうどを使用する場合、エイリアスなどを継承しないことに気づきましたexec bashexec bash --login役立ちますが、既に述べたように、bashの内部でbashを実行しますが、これは私たちが本当に望んでいるものではありません。
altendky

実際の解決策。Notくない。+1
アンドリュー

2

(Ab)使用.bashrc唯一の使用可能な方法です。1生成は不要ですが、コマンドを環境変数に入れるだけevalで次のようになります:

  • あなたの最後に以下を入れてください~/.bashrc

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

    env startup_cmd='vim' bash

1「C4を使用してナットをクラックする」ものを除外しましょう。


見栄えが良く、一目で動作します... bashrcを変更する必要があります、それで生活できます...しかし、何らかの理由で、ctrl-zはまだ動作しません-アイデア?-c4ベースのソリューションはどのような食器棚にありますか?
marvin2k

0

ctrl-zを出力する機能を備えたtmuxウィンドウでvimを生成したいというコンテキストで、同じ問題が発生しました。最終的に、bash内でそれをきれいに行う方法を理解できませんでした。私は次のことに決めました。

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"

0
bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 `</tmp/foo`; )' ) -i

ユーザーのおかげでWOR「のためのオンザフライのカスタムのbashrcファイル」!

もう1つの重要な部分は、bash組み込みの「トラップ」です。

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

ところで、あなたが言う「ターミネーター」が何であるかはわかりません。

これは、bashとscreenで解決策を探しているときに見つけました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.