我知道:
$ command -[options] string string2
可以轻松更改:
$ ^string^string3
获得方法:
$ command -[options] string3 string2
我还能用它做什么,就像我试图连续做两次一样:
$ ^string3^string && ^string2^string4
或者在命令之后
$ ffmpeg -i file output.mp4 && ^.mp4^.mp3
或者
$ echo blue && ^blue^red
^blue^red: command not found
不起作用
或者
$ echo blue
blue
$ ^blue^red && ^red^purple
red blueblue red^purple
不工作
或者
$ echo blue
$ ^blue^red^red^purple
echo redred^purple
redred^purple
还是行不通
它是用于 bash 脚本的,我所知道的最短的东西是 ^...^...
我需要一个简短易用的命令来实现这一点,
通过这些例子,你可以明白,
有什么必要呢?有人建议我:
$ echo blue && !#:s/blue/purple/ true
echo blue && echo purple && true
blue
purple
结果与我预期的非常吻合,但最终>
命令无法完成。更新:我通过在末尾添加 true 来修复此问题。
这个问题之前出现在 StackOverflown 中,并被推荐放在这里!
答案1
首先:所有这些快捷键都是用于交互使用,而不是用于脚本。它们都是 bash 历史系统的一部分,通常在脚本中被禁用(可能应该保持禁用状态)。
第二:该^original^replacement
语法被称为“快速替换”,其目的是(顾名思义)通过简单的更改快速重新运行上一个命令。它是不是可扩展到基本用途之外——无法使用此语法进行多项更改。但您可以使用更通用(但冗长)的语法:!!
指定最后一个命令(实际上是行;见下文),您可以添加修饰符来:s/original/replacement/
进行更改。以下是包含两个替换的示例:
$ echo string1 string2
string1 string2
$ !!:s/1/3/:s/2/4/
echo string3 string4
string3 string4
第三:正如我所说,此历史记录调用和重放功能实际上适用于行(或多行命令),而不是简单命令。以下是一个例子:
$ echo "command one"; echo "command two"
command one
command two
$ echo "command three" && !!:s/command/line/
echo "command three" && echo "line one"; echo "command two"
command three
line one
command two
请注意,!!:s/command/line/
并没有调用上一个命令,echo "command three"
甚至不是echo "command two"
,而是整个前一行!此外,即使command
该行中出现了两次,替换也只执行了一次。如果要替换所有出现的情况(“全局替换”),请添加修饰符g
(!!:gs/original/replacement/
)。有其他修饰符的数量您可以使用。
最后:这可能会变得很复杂,而且很容易错误预测按下回车键时会发生什么。Kamil Maciorowski 建议以交互方式调用和编辑上一个命令,这样您就可以在按下回车键之前看到该命令,所以我建议使用该方法。
实际上,我通常自己做的是按向上箭头来返回上一个命令,然后使用 bash 的内置行编辑功能进行我想要的更改。
答案2
点击↑并使您想要更改的命令出现在命令行中。然后按Ctrl+ X, Ctrl+E在您喜欢的编辑器中编辑它。
您可以多快、多轻松地进行所需的更改取决于编辑器和您对它的熟悉程度。要执行,请以编辑器提供的任何名称保存文件并退出编辑器。
VISUAL
通过设置或变量选择您的编辑器EDITOR
。来自man 1 bash
:
edit-and-execute-command
(C-xC-e
)
在当前命令行上调用编辑器,并将结果作为 shell 命令执行。Bash 尝试按顺序调用 、 和 作为编辑$VISUAL
器$EDITOR
。emacs
注意可以配置键绑定。Ctrl+ X,Ctrl+E是我所说的默认值。
此外你可能会发现这很有用:ctrl-xe 不立即执行命令