在终端工作时,我经常会遇到如下命令序列:
cat long/path/to/file/xyz.file
nano long/bath/to/file/xyz.file
bash long/path/to/file/xyz.file
ETC
通常我会按control + A,向右箭头几次,退格几次,然后编写新命令。
但在我这样做的十秒钟里,我总是想知道是否有一些神奇的捷径可以为我做到这一点。所以我的问题是...
是否有终端快捷方式可以删除命令但保留参数?
如果没有,有没有办法编写自己的快捷方式?
我大部分时间使用的终端是 Ubuntu 和 OSX(如果有的话)。
答案1
在许多shell中,AltD会删除从光标到光标下的单词末尾,因此您可以执行CtrlA以下操作AltD来删除第一个单词。
或者,在具有历史操作的 shell 中,!:1-$
将被前一个命令的所有参数替换,因此您可以键入新命令,然后键入该命令来复制前一个命令的参数:
$ echo Hello sudo rm -rf slash
Hello sudo rm -rf slash
$ printf "%s " !:1-$
Hello sudo rm -rf slash
如果您的命令只有单个参数,或者您只对最后一个参数感兴趣,则可以将其缩短为!$
;所以在你的情况下
$ cat long/path/to/file/xyz.file
$ nano !$
$ bash !$
答案2
!:1-$
除了使用获取所有参数之外,我将提供另一种方法。
您可以使用拼写错误纠正模式^strA^strB
来替换strA
为strB
。例如,之后
$ cat path/to/file
你可以做:
$ ^cat^nano
cat
这将更改上一个命令中的第一个匹配项并再次执行该命令。显然,这个技巧在其他情况下可能更有用,例如如果您想在上一个很长的命令中间更改文件名。
答案3
好的。因此,以下内容仅适用于 bash shell,或者我不确定这是否适用于所有 shell。
假设您在每个后续命令中使用命令行参数。
cat long/path/to/file/xyz.file
因此,在下一个命令中,您希望保持参数“long/path/to/file/xyz.file”相同,但想要更改命令,这就是您将如何执行此操作,nano !$
并且在下一个后续命令中,您将执行相同的操作。bash !$
。因此!$
保持最后一个命令的最后一个参数不变。例如,tail -f /var/log/messages
somecommand !$
实际上会变成somecommand /var/log/messages
而不是somecommand -f /var/log/messages
还有另一个功能可以让您保持最后一个命令不变。例如,您想使用 sudo 权限运行最后一个命令。假设您运行了tail /var/log/messages
并且没有查看内容的权限,因此您不必使用 sudo 编写整个命令,只需执行sudo !!
bash shell 就会自动将其转换为sudo tail /var/log/messages