履歴コマンドを実行せずにコマンドラインに配置する


57

!nを使用します。ここで(n)は、history | lessを介して見つかったコマンドプロンプトで実行する履歴ファイル内の行を実行するための行番号です。

しかし、手動で変更したいコマンドライン履歴イベントがあります。変更してからReturnキーを押すことができるように、実際に実行せずに履歴イベントの内容をコマンドラインに挿入するにはどうすればよいですか?

ベスト、

回答:


71

コマンドは印刷ではなく、ヒストリ置換後に実行することを要求するには、追加:p 修飾子を例えば、!42:p。結果のコマンドも履歴に入力されるため、を押しUpて編集できます。

あなたが持っている場合はhistverify オプション設定を(shopt -s histverify)、あなたは常にヒストリ置換の結果を編集する機会を持つことになります。

fc組み込みは、履歴展開(なしワード指定子)へのアクセスが制限されています、そしてあなたは、外部エディタで前のコマンドを編集することができます。

あなたは使用することができます!prefixから始まる最後のコマンドを参照するためにprefix、そして!?substring始まる最後のコマンドを参照することsubstring。探しているものがわかっている場合、これにより時間を大幅に節約できますhistory | less

以前の履歴を検索する別の方法は、インクリメンタル検索です。Ctrl+ Rを押して、探しているもののサブストリングの入力を開始します。検索文字列のこれまでの出現箇所に移動するにはCtrl+ Rを押し、行き過ぎた場合はCtrl+をS押します。Ctrl+ RCtrl+ SBackspaceおよび通常の文字以外のほとんどのキーは、インクリメンタル検索を終了し、通常の効果をもたらします(たとえば、矢印キーを使用して、到達した行にカーソルを移動しEnter、コマンドを実行します)。


最初の例にタイプミスがあります
...-pbm

9
stty -ixonCtrl-sが機能する前に行う必要があります。
デニスウィリアムソン

@Dennis:うわー、最近の端末エミュレータはデフォルトでこれをしませんか?<test>そのとおりです。Ubuntuのgnome-terminalでさえフロー制御を持っています!
ジル 'SO-悪であるのをやめる

なぜ彼らはまだそうするのか分かりません。スクロール中に何かをキャッチすることは不可能です。Ctrl-sを押すまでに、再びプロンプトが表示されます。そして、遅いシリアル接続はほとんど過去のものです。
デニスウィリアムソン

@DennisのポイントCtrl-sは重要です。そうでなければ、私がやったよう行き詰まります。
imz-イヴァンザカリヤシェフ

15

別の小さなもの:Alt+#

現在の行をコメントアウトして、履歴バッファに移動します。

したがって、コマンドラインをアセンブルしていて、たとえばファイルを見つけるために暫定コマンドを発行する必要がある場合は、単にAlt+を押して#、他のコマンドを発行し、履歴を上に移動し、コメントを外して続行します。


2
またEsc#作品
スティーブンペニー

他のketコンボ(fn + alt + shift +#)とは異なり、実際にMacで入力できます(Shiftキーを押しながらESCキーと#キーを同時に押します);-)
0xF2

7

Enterキーを押す前に、マジックスペースを使用して履歴を展開できます。.inputrcで、スペースをマジックスペースにマップします。

$if Bash
     Space: magic-space
$endif

これで、履歴指定の後にスペースを入力するたびに、すぐに拡張されます-編集したい場合にも便利です!



4

を使用しCtrl+rて履歴を検索できます:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

見つかったコマンドはすべて編集できます...


私はあなたが必要とするものを正確に見つけたと思います:実行shopt -s histverifyして次に!nコマンドを使用したいときは実行されず、コマンドラインに置くだけです...


Vassが要求しているのではなく、Ctrl + rで検索する前にコマンドを実行する必要があります。
プネヘヘ

1
私はこれが彼が尋ねることをいかにしないか理解しません。コマンドを実行する前に最初に編集する場合は、正しいコマンドが見つかったらTabキーを押すだけです。
スティーブンD

2
したがって、手順は、(1)Ctrl + r、(2)コマンドが見つかるまで入力する、(3)TAB、(4)コマンドを編集する、(5)ENTERのようになります。
スティーブンD

1
@phuenhehe:「しかし、私は手動で変更したいコマンドライン履歴イベントがある」
PBM

1
!n:p動作しませんか?
アレックス

1

私はしばしばこれを望んでいました。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で有効です。


質問にはbashのタグが付けられているため、ソリューションは(t)cshでのみ機能すると言うことから始めるのが良いかもしれません。
ザグリムサン

0

通常、Ctrl+ rを使用して検索し、Ctrl+ eを使用して実行せずに行の最後に移動します。



@JeffSchaller私はそれを見ていません。CTRL + Rリファレンスが表示されます。いいえ、上記の投稿でパズルの欠けている部分であるCTRL + Eはどこにありますか?
nikc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.