他のシェルでテスト

他のシェルでテスト

not通知()を表示する機能があります。したがって、これを使用してコマンドが完了したタイミングを表示できます。

sleep 5; not

しかし、時には;notOS Xの端末で(数年前)、現在のコマンドが実行されている間に2番目のコマンドを入力することができました。第2の命令は、第1の命令が完了した後に実行される。

だから入力sleep 5Enterしてすぐに入力しますnotEntersleep終了後に実行されますnot

しかし、Linuxでの私の経験によると、これは起こりません。終了後にsleepコマンドラインが表示されますが、not登録されEnterません。 Terminator、Konsole、tty をテストしました。

この動作は端末エミュレータによって異なりますか?それでは、あなたが望む方法で動作するものはありますか?または、私が選択した端末(ターミネーター)でこれを行う方法はありますか?

他のシェルでテスト

動作しません。つまり、2番目のコマンドは登録されていません。

  • bash
  • bash --norc
  • bash --norc --noprofile
  • sh

動作します。つまり、2番目の命令レジスタは次のようになります。

  • bash --norc --noprofile --noediting
  • zsh

~/.inputrcデフォルトのシェルからその行を選択的に削除し、再bashテストしました。問題を次の行に追跡しました。削除されると、2番目のコマンドが期待どおりに登録されます。

Control-j: menu-complete

Ctrl奇妙なことは、+をバインドしようとするとi問題がないということです。この項目が2番目のコマンドが登録されるのを防ぐ理由は何Ctrlですかjmenu-complete

答え1

bashを使用していると仮定すると、^ Z(Ctrl + Zなど)を押してプロセスを停止し、背景に移動し、別のbashプロンプトを表示します。 input fg; not、前者は停止したプロセスを継続し、完了すると返されます。

または、待機したいプログラムのプロセスID(2342など)を確認してください。新しいShouldに次のように入力します。

until kill -0 2342; do sleep 1; done; not

これは毎秒確認されます。

答え2

まあ、編集内容の一部に基づいてマクロコマンドCTRL+Jにバインドしました。bindkeyこれは基本的な動作を考慮したbash問題を説明しますreadline

入力は通常、readline非常に似たstty rawパターンで読み取られます。入力文字は入力されるとすぐに読み取られ、シェルの行エディタは独自のバッファリングを処理します。readlineフォアグラウンドを取得すると、端末を元の状態に設定し、別のフォアグラウンドプロセスグループが呼び出された場合は、前の状態に復元します。

CTRL+JASCII 改行文字です。ABCDEFGHIJNULで10バイト。readlineこの文字を食べてメニューの完成時に実行されるコマンドラインの残りの部分を拡張するように設定したため、オートコンプリート機能は機能しません。オートコンプリートがカーネルの行規則によってバッファリングされると、端末はreadline前景にあるときとは異なる状態になります。

フォアグラウンドにあるとき、readline入力キャリッジリターン -> 改行文字を独自に変換し、ターミナルドライバはこれをまったく変換しません。ただし、自動入力内容を入力すると、ターミナルドライバは通常キャリッジリターン文字を使用できる改行に変換しますstty [-]icrnl。したがって、ライブ入力コマンドには戻りキーで十分ですが、端末の行規則は改行記号を送信します。フルメニューコマンドとして解釈されます。

を使用して、ターミナルドライバにこの変換を停止するように指示できますstty -icrnl。慣れるまでに少し時間がかかることがあります。ターミナル入力を許可する他のコマンドは通常、戻り値ではなく改行文字を期待するため、前景を制御CTRL+Jするときに明示的に使用するか、bash戻り値をこのように処理するように教える必要があります。

read端末で読んだときに期待どおりに機能しないと言われました。繰り返しますが、明示的にを使用して入力行を終了すると、CTRL+Jこれが発生する可能性があります。または...教えることもできます:

read()
    if    [ -t 0 ]
    then  command read -d $'\r' "$@"
    else  command read "$@"
    fi

しかし、他のメニューの完成キーを見つけると、長期的に多くの労力を減らすことができます。ほとんどの端末アプリケーションでは、改行文字は大きな意味を持ちます。

関連情報