如何使用添加的参数重复命令

如何使用添加的参数重复命令

我知道如何重复命令并在其后添加更多文本,!!如下所示:

ls -l
!! tmp

第二行扩展为ls -l tmp.

但是如果我想在单词之间的命令中添加参数怎么办?例如,如果我执行了以下操作:

ls tmp

...然后我经常想将-l参数添加到命令中,但不重新输入整个内容或按向上键并使用箭头键将光标设置到正确的位置。!! -l不起作用,因为它变得ls tmp -l无效。 (实际上,该命令比我在这里使用的简单示例长得多。)

换句话说,我正在寻找类似?? -lwhere ??is 重复前一个命令但-l在第一个和第二个单词之间添加的内容。


为了清楚起见,ls -l tmp这只是一个简化的例子。现实生活中的用例更接近于类似的情况/very/long/path/to/very-long-command --with=a --very=long --parameter=list

答案1

!!:0是前一个命令的第 0 个字,并且!!:*是除第 0 个字之外的所有字。

!!:0 -l !!:*

是您正在寻找的命令。

来源https://www.gnu.org/software/bash/manual/bash.html#Word-Designators

答案2

你可以:

$ ls -l
[..]
$ !:0* /tmp
[..]

这将调用ls -l /tmp.请参阅bash手册页:

   Word Designators
       Word designators are used to select desired words from the event.  A : separates the 
       event specification from the  word  designator.   It  may  be  omitted  if the word
       designator begins with a ^, $, *, -, or %.  Words are numbered from the beginning of
       the line, with the first word being denoted by 0 (zero).  Words are inserted into the
       current line separated by single spaces.

       0 (zero)
              The zeroth word.  For the shell, this is the command word.
       n      The nth word.
       ^      The first argument.  That is, word 1.
       $      The last argument.
       %      The word matched by the most recent `?string?' search.
       x-y    A range of words; `-y' abbreviates `0-y'.
       *      All of the words but the zeroth.  This is a synonym for `1-$'.  It is not an 
              error to use * if there is just one  word  in
              the event; the empty string is returned in that case.
       x*     Abbreviates x-$.
       x-     Abbreviates x-$ like x*, but omits the last word.

       If a word designator is supplied without an event specification, the previous command
       is used as the event.

答案3

Bash 允许您快速搜索并在提示符中返回历史记录中的命令,以便您可以在执行之前手动编辑它。

根据提示:

  1. Ctrl-R(像everse):提示应该改变,以通知您现在处于反转模式,
  2. 开始键入命令的任何部分(在您的示例中,您可以键入lstmp,甚至mp匹配ls tmp):最后使用的与您的击键相匹配的命令将在您键入时显示。
  3. 找到命令后,只需tab在正常提示符中键入即可获取它:它还不会被执行,它将在这里等待您的修改,例如任何参数添加、删除或更改,或应用不同的命令相同的文件等

答案4

要启动上一个命令并在命令名称后立即添加选项,请按以下键:
Up Home Ctrl+ Right Space(键入选项)Enter

如果光标键在您的系统上不起作用,您可以使用 Emacs 运动键代替:
Ctrl+ P Ctrl+ A Meta+ F Space(键入选项)Enter

如果命令名称有多个单词(例如,因为它是带有斜杠的路径),Ctrl+Right只会移过第一个斜杠。而是搜索第一个空格。

Up Home Ctrl+ S Space Esc Space(键入选项)Enter
Ctrl+ P Ctrl+ A Ctrl+ S Space Esc Space(键入选项)Enter

通过此搜索,您可以从代替Up Up,Up HomeCtrl++代替++开始。按键次数相同,但打字稍微容易一些,但不太直观。P CtrlPCtrlP CtrlA

如果您愿意,您可以使用历史替代设施,如果命令包含斜杠,则按键次数会减少。
^ ^ --option 
请注意选项后面的尾随空格:您将用一个空格、新选项和另一个空格替换命令中的第一个空格。

相关内容