web-dev-qa-db-ja.com

コマンドを入力していない場合、Ubuntuターミナルでコマンドを保存する方法はありますか?

Ubuntuのターミナルでコマンドを保存する簡単な方法があるかどうか疑問に思っていました。シナリオは次のとおりです。

問題:

  1. [長いコマンド]を入力した
  2. [長いコマンド]を実行する前に[別のコマンド]を実行する必要があることを忘れた

コマンドを保存して、後で#を前に置いて上下キーの履歴に置くだけではなく、簡単に使用できるようにしたいと考えています。レジスタまたはクリップボードに直接保存するのが最適です。

私もエコーしたくなかったと言うのを忘れていました。

45
duckingChickens

これはあなたの端末ではなく、これはあなたのシェルです。

探しているシェルメカニズムの名前はkill bufferです。シェルコマンドラインエディターにはこれらの機能があることを人々は忘れています。 GNU Bourne AgainシェルのReadline、(FreeBSD)Almquistシェルのlibedit、Kornシェルのラインエディター、およびTENEX Cシェルのラインエディター)のように、ZLEのZLEにはそれらがあります。

emacsモードのこれらのすべてのシェルで、保存する行の終わりに移動し、次のコマンドを使用して、ヘッドキルバッファーにキルします。 ⎈ Control+U、中間コマンドを入力して実行し、キルバッファの内容を次のコマンドでヤンクします。 ⎈ Control+Y。中間コマンドを入力するときは、killバッファーを使用して何もしないでください。

viモードのZシェルでは、行を削除する名前付きのviスタイルのバッファーを指定するためのviプレフィックスシーケンスがあります。デフォルトのバッファーの代わりに、他のバッファーのいずれかを使用できます。単に次のようなものを使用してください "addvicmdモードの場合)行全体をバッファー "a"に削除し、中間コマンドを入力して実行してから、そのバッファーの内容を "ap

viモードでは、Kornシェル、Bourne AgainシェルのGNU Readline、および(FreeBSD)Almquistシェルのlibeditには、viという名前がありません。スタイルのバッファ、1つのカットバッファのみ。 dd 行をそのバッファーに削除し、続いてバッファーの内容を p、 動作します。ただし、中間コマンドの入力時にkillやyankingと同じviスタイルのバッファを使用します。

52
JdeBP

echo(またはその他のno-op-typeコマンド)を行の先頭に追加したくない場合は、I/Oリダイレクションがあり、それでも実行されるため、ファイルが上書きされる可能性があります。 (コマンドを実行する準備ができるまで)アクセスする必要があります。

代わりに、行の先頭に移動して、コメント文字#を入力します。次に、押すことができます Enter、行が履歴に保存されます。

Viモードの場合、kshとbashには(少なくとも)このための特定のコマンドがあります。コマンドモードに入ります(押す Esc)次に、 # キャラクター。

これは特にこのユースケースのためのものです。 O'Reilly Learning the Korn Shellの本でのこのコマンドの説明は次のとおりです。

行の先頭に#(コメント文字)を追加し、履歴ファイルに送信します。再入力せずに後で実行するコマンドを保存するのに役立ちます。行がすでに#で始まっている場合は、複数行コマンドの先頭の#と、改行に続くその他のコメント文字を削除します。

31
user7761803

zshを実行している場合は、 Ctrl-Q、コマンド Push-line 。現在入力しているものをスタックに保存し、プロンプトをクリアして、次のコマンドを入力した後にスタックをポップします。私はあなたが説明する状況に正確にいつもこれを使用します。

16
0x5453

私は通常、行の終わりに "'"(一重引用符)を追加し、EnterキーとCtrl-Cを押します。後で、カーソルアップまたはCtrl-Rでそれを思い出します。ただし、以前に引用符が抜けていないことを確認する必要があります。

6
Edheldil

シェルがemacsモード(bashの通常のデフォルト)に設定されている場合:

#set -o | grep emacs
emacs         on

その後、次のことができます。

<Ctrl>a or <arrowkeys> # to go to the beginning of the current line or to wherever you want
<Ctrl>k    # to "kill" the content from the cursor position to the end of the line + SAVE it
... here you type the command you forgot to add ...
<Ctrl>y    # to "yank" the SAVED line into the current editing line. or <Ctrl>p in ksh(??)
<Enter>    # to execute it

#note: you can also replace: <Ctrl>a<Ctrl>k with: <Ctrl>u # kills the whole line + SAVE it

これは非常に速く、習慣になります。 ctrl-kは、行の「終わり」のみを保存する場合にも役立ちます(例:後で再利用することがわかっている2つの長い引数、「kill」(+保存)、「yank」できること何度でも戻ってください)

シェルがviモードの場合、通常のvimコマンドを使用できます。

<Esc>      # to go back to normal(command) mode, if you were in editing mode
dd         # to delete the whole current line + SAVE it  (see note below)
i          # to reenter editing mode
... here you type the command(s) you forgot ...
<Esc>      # to return to normal mode
p          # to paste the buffered line + place the cursor on top of the last character
a          # to reenter editing mode past that current character
<Enter>    # to execute it

# note: instead of "dd" (kill whole line) you can simulate emacs <Ctrl>a<Ctrl>k with:
#    | or h or l  # to go to the 1st char of the line or wherever # simulates <Ctrl>a or <arrow keys>
#    d$  # to delete from the current position to the end of the line + SAVE it # <Ctrl>k
4
Olivier Dulac

場合によっては機能する回避策。

really long command thigng -flag -flag2

ホームを押し、新しいコマンドを入力してから&&を実行して最初に実行し、成功した場合は2番目に実行します。

first command && really long command thigng -flag -flag2

その後は、個別のステップとして保存されません。

または:

既に最初のコマンドを入力した場合(Enterキーを押すなど)、first_command && !!と入力すると、2番目のコマンドが!!に挿入されます。

4
Viktor Mellgren

GUIまたはシェルの機能のいずれかを使用してテキストを選択/コピーしてから、ファイルに貼り付けるか、またはnotを忘れないようにして、後続の選択で上書きすることができます(したがって、元に戻すことができます)必要な場合)、しかし、私はその厄介なことに気づきます:完全なコマンドラインの場所は、「キーの上下履歴」の中で私見です。

行の先頭に#を追加して<Enter>を押す代わりに、現在のコマンドラインを実行せずに履歴に保存するキーバインドを作成できます。

例えば。 bashを使用して、それをMeta/Alt-CまたはEsc-Cにバインドします(通常、emacsキーバインディングでcapitalize-Wordにバインドされます。すでに使用している場合は、別のキーを使用してください)。

bind -x '"\ec": history -s "$READLINE_LINE"; READLINE_LINE='

Viキーバインディングを使用している場合は、未使用の^Gをスクワットできます。

bind -x '"\C-g": history -s "$READLINE_LINE"; READLINE_LINE='

それはまた、後に線を引くでしょう。これを望まない場合(および^Cを使用して手動で行をキャンセルしたい場合)、READLINE_LINE=を省略します。

3
mosvy

難解なさまざまなreadlineキーボードショートカットを扱うのではなく、シェルの履歴ファイルを直接編集できます。 bashの場合:

  1. history -w(既存の履歴をフラッシュ)
  2. $EDITOR $HISTFILE(履歴ファイルを編集(~/.bash_historyデフォルトで)、必要な変更を行います)
  3. history -c ; history -r(シェルのメモリ内の履歴をクリアし、履歴ファイルから再読み込みします)

私はbashの履歴を大幅に調整したいので、bash関数を作成してより便利にしています。

histedit()
{
  # Flush history.
  history -w

  # Open an editor at the last line.  Pipe the file into `wc` to suppress
  # printing the filename.
  #
  # Note that some versions of `wc` (e.g. BSD) do not support long options
  # and print with leading spaces.
  last_line=$(wc -l < "${HISTFILE}")
  last_line=$(( "${last_line}" ))

  "${EDITOR}" "+${last_line}" "${HISTFILE}"

  # Reload the history file.
  history -c
  history -r
}

さらに、入力したコマンドを修正して再実行するために、 bashの履歴をすばやく検索して置き換えるための個別のbash関数 があります。

2
jamesdlin

2番目のコマンドを既に入力している場合は、行の先頭に移動し、最初のコマンドを入力してから、セミコロンで2つを区切ります。これは成功が問題ではない場合です。問題がある場合は、&&の誰かが提案しました。

2
WGroleau

いいえ、入力されたコマンドのみを取得するため、コマンドライン履歴に保存されません。

ただし、「エコー」を前に付けて、タイプするのが複雑だったものを保存できます

echo /usr/bin/complicate -v e -r y -c o -m p -l ic -a t -t ed

次に、echoコマンドを呼び出し、編集して「echo」を削除します。

後で準備するために履歴に何かが必要な場合は、履歴ファイルを編集することもできます。 bashの場合は~/.bash_history、tcshの場合は~/.history。ファイルの構文を推測する必要がないため、既存のコマンドを変更して編集します。次に読み込まれる場合にシェルが起動するとき(ほとんどのシステムでデフォルトで行われる、履歴を保存して読み取るようにシェルが構成されている場合)。

多くの入力をせずに複雑なコマンドを使用する3番目の方法は、コマンドのエイリアスを定義することです。ここでも、構文はシェルのバリアントによって異なります。

bash:

alias ll='ls -algF --color=auto'

tcsh:

alias ll 'ls -algF --color=auto'

新しいコマンドllは、ls -algF --color=autoを入力するのと同じことを行います。パラメータなしでaliasを実行するだけで、既存のエイリアス(例)を確認できます。

これらの行を~/.bashrcおよび~/.tcshrcに入力して、今後のすべてのShellスタートアップでそれらを保存できます。

1
Ned64