ターミナルで前に感嘆符を無視できますか? (ipythonのおかげで本能的に入力します)

ターミナルで前に感嘆符を無視できますか? (ipythonのおかげで本能的に入力します)

私はほとんどの人生をIPythonシェルから送ったので、ターミナルコマンドの前に感嘆符を付ける悪い習慣があります。通常、これはエラーを引き起こしますが、時には悪いことがあります。!端末の機能を効果的に無効にできますか?これはスクリプトを妨げる危険がありますか?

答え1

対話型シェルでは、デフォルトで!履歴拡張のために、シェルは次のテキストに一致するコマンドを探し、!そのコマンドを実行します。に示すようにこの回答到着Bashで感嘆符(!)を使用できませんか?シェルでは、履歴拡張を無効にできます。

  • 大きな打撃:set +H
  • ジシュ語:set -K

感嘆符ベースの履歴拡張を使用したくない場合は、シェルの起動スクリプトに追加します。

これは!無視されませんが、履歴からのコマンドの実行を防ぎます。存在しないと文句を言う!commandでしょう!command

シェルスクリプトはこれらの設定の影響を受けず、非対話型設定を使用して独自のシェルを取得します(履歴拡張はデフォルトでは含まれていません)。

答え2

絶対に使わないなら!ターミナルで(私の場合は)wasaseなど、絶対に使用しない機能にそれを割り当てることができます。

stty werase !

その後、入力するたびに! 、前の単語だけが削除されます。ターミナルコマンドの先頭に入力してもまったく効果はありません。

実際の感嘆符が必要な場合は、lnextCTRL-V(またはあなたの役割が何であれ)を前に付けて引用/エスケープして入力できます。

通常、この機能を使用しない場合は、lnext上書きする方lnextが便利です!。これにより、感嘆符を2回入力し(最初は2番目を表します)、感嘆符を入力できます。

stty lnext !

どのように機能するかについての詳細な説明:

機能は次lnextのとおりです。 「次の文字を特殊文字として解釈せず、その文字だけを入力として受け入れます。」 stty特殊文字の場合、特殊機能は適用されず、文字自体のみが使用されます。これには、lnext機能に割り当てられた文字が含まれます。

デフォルトlnextの文字はCTRL-Vです(ニーモニック:「verbatim」、例:次の文字をそのまま入力)。ここでは、その機能を役割に再割り当てします!

lnextほとんどの場合、効果は「効果なし」であるため、主に選択されています(たとえば、次の文字が一般文字の場合)。誤って!行の先頭に入力した場合、次の文字はほとんど常に一般文字なので特別な操作は必要ないので、これを引用/エスケープ処理(明示的に一般文字として処理)しても何の害もありません。aanの後にanを書き込むとき、!意味は「write one a」で同じ機能を提供するより具体的な意味に変更されます。 「oneを書いてa、他は無視して、ちょうどやってください!」

実際の文字を生成するには、!このlnext関数を使用して参照できます。したがって、入力すると!!1つを入力します。!

答え3

シェルを使用している場合は、zsh以下を追加できます~/.zshrc

zmodload zsh/zselect
bang() {
  zle self-insert
  if [[ $CONTEXT = start && $LBUFFER =~ '^!+$' ]]; then
    local -a old_region_highlight=($region_highlight)
    region_highlight+=("0 $CURSOR fg=red,bg=white,bold,standout")
    zle -R 'Will you please stop?!'
    zselect -t 100 -r 0 < /dev/tty
    region_highlight=($old_region_highlight)
    LBUFFER=
  fi
}
zle -N bang
bindkey '!' bang

これにより、!編集バッファの先頭に1つ以上を入力すると、赤で強調表示され、メッセージが表示され、削除されます(1秒後または他のエントリを入力した場合はより速く)。

関連情報