回答:
コマンドは印刷ではなく、ヒストリ置換後に実行することを要求するには、追加:p
修飾子を例えば、!42:p
。結果のコマンドも履歴に入力されるため、を押しUpて編集できます。
あなたが持っている場合はhistverify
オプション設定を(shopt -s histverify
)、あなたは常にヒストリ置換の結果を編集する機会を持つことになります。
fc
組み込みは、履歴展開(なしワード指定子)へのアクセスが制限されています、そしてあなたは、外部エディタで前のコマンドを編集することができます。
あなたは使用することができます!prefix
から始まる最後のコマンドを参照するためにprefix
、そして!?substring
始まる最後のコマンドを参照することsubstring
。探しているものがわかっている場合、これにより時間を大幅に節約できますhistory | less
。
以前の履歴を検索する別の方法は、インクリメンタル検索です。Ctrl+ Rを押して、探しているもののサブストリングの入力を開始します。検索文字列のこれまでの出現箇所に移動するにはCtrl+ Rを押し、行き過ぎた場合はCtrl+をS押します。Ctrl+ R、Ctrl+ S、Backspaceおよび通常の文字以外のほとんどのキーは、インクリメンタル検索を終了し、通常の効果をもたらします(たとえば、矢印キーを使用して、到達した行にカーソルを移動しEnter、コマンドを実行します)。
stty -ixon
Ctrl-sが機能する前に行う必要があります。
デフォルトhistory-expand-line
でバインドさAlt+^
れているコマンドを見てください。行をインプレースで展開し、編集できます。
を使用しCtrl+r
て履歴を検索できます:
pbm@tauri ~ $
(reverse-i-search)`xran': xrandr -o normal
見つかったコマンドはすべて編集できます...
私はあなたが必要とするものを正確に見つけたと思います:実行shopt -s histverify
して次に!n
コマンドを使用したいときは実行されず、コマンドラインに置くだけです...
!n:p
動作しませんか?
私はしばしばこれを望んでいました。csh(およびtcsh)を使用したとき、私はイディオムがありました:
!:88*:p
このイディオムは、前のコマンドの「ワード88から最後のワードまで」を、現在のコマンドラインで入力しているポイント(通常は最後)に挿入します。cshでは、このような式が単語を生成しないことはエラーではありません。つまり、88という単語も、それに続く単語も必要ありません。ワード88がない場合、入力されているコマンドの最後にワードが追加されず、結果のコマンドラインが実行されずに履歴にプッシュされます。
おそらくご存知のように、
*!(!!や!-1など)は前のコマンドです。
*:88はワード88(最初のワード-通常はコマンド-はゼロ)であり、cshはそのようなワードが存在することを要求しますが、...
::88 *はワード88で始まるすべてのワードであり、cshはそうです言葉が存在することを要求しない;
*:pは印刷を意味しますが、コマンドラインは実行しません。
:pの有無にかかわらず、コマンド履歴はコマンド履歴に追加されます。
「なぜ88?」あなたは疑問に思う?これは*と同じキーだからです。それほど長いコマンドがある場合は、おそらく!:888 *:pが必要です。すみません、これはbash AFAIKでは動作しません。バッシュは単に言うだろう
bash: :88*: bad word specifier
おもしろい事実:コマンドは通常最初にする必要はありません。
> /tmp/foo echo My command is word 3
bashおよびcshで有効です。