not
通知()を表示する機能があります。したがって、これを使用してコマンドが完了したタイミングを表示できます。
sleep 5; not
しかし、時には;not
OS Xの端末で(数年前)、現在のコマンドが実行されている間に2番目のコマンドを入力することができました。第2の命令は、第1の命令が完了した後に実行される。
だから入力sleep 5
Enterしてすぐに入力しますnot
Enter。sleep
終了後に実行されます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ですかj?menu-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+J
ASCII 改行文字です。ABCDEFGHIJ
NULで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
しかし、他のメニューの完成キーを見つけると、長期的に多くの労力を減らすことができます。ほとんどの端末アプリケーションでは、改行文字は大きな意味を持ちます。