now*_*wox 45 linux bash shell command-line
我想用 Bash 稍微改进我的工作流程,我意识到我经常想对不同的可执行文件执行相同的命令。
一些例子:
Git(我想快速更改第二个词):
git diff foo/bar.c
git checkout foo/bar.c
Run Code Online (Sandbox Code Playgroud)
Cat/rm(只需更改第一个单词):
cat foo/is/a/very/long/path/to/bar.c
rm foo/is/a/very/long/path/to/bar.c
Run Code Online (Sandbox Code Playgroud)
我知道我可以点击Ctrl+ athenDel删除第一个单词,但我想知道是否有更快的方法来做到这一点。
Spi*_*iff 57
!$
扩展到上一个命令的最后一个单词。
所以你可以这样做:
cat foo/is/a/very/long/path/to/bar.c
rm !$
Run Code Online (Sandbox Code Playgroud)
或者:
git diff foo/bar.c
git checkout !$
Run Code Online (Sandbox Code Playgroud)
你的例子碰巧只重复了最后一个词,所以!$
效果很好。如果您实际上有很多要重复的参数,而您只想更改第一个单词,则可以使用!*
,它将扩展为除第零个之外的前一个命令的所有单词。
请参阅bash
手册页的“历史扩展”部分。那里有很大的灵活性。
jjl*_*lin 28
Ctrl+a转到行首,然后Alt+d删除第一个单词。
小智 17
我不确定它是否真的会更快,但请参阅这篇文章,特别是第 #.3 点:
- 使用 ^str1^str2^ 替换上一个命令中的字符串
在以下示例中,我们首先执行 ls 命令来验证文件。后来我们意识到我们要查看文件的内容。无需再次输入整个文件名,我们只需将上一个命令中的“ls”替换为“cat”,如下所示。
Run Code Online (Sandbox Code Playgroud)$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
Has*_*tur 16
Alt+.
如果您只需要重复前一个命令的最后一部分,您可以使用Alt+.粘贴从历史记录最后一行获取的最后一个参数。
如果按下多次,将用之前该行的最后一个参数替换刚刚粘贴的内容...
例如,如果最后 2 个命令是:
cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c
Run Code Online (Sandbox Code Playgroud)
在我写的 shell 中rm
,我按下Alt+.它会出现:
rm foo/is/a/very/long/path/to/SomeWhereElse.c
Run Code Online (Sandbox Code Playgroud)
如果我再次按下Alt+.它会出现
rm foo/is/a/very/long/path/to/bar.c
Run Code Online (Sandbox Code Playgroud)
等等...
mai*_*iki 12
除了@jjlin 的回答,您可能会对以下提示感兴趣:
$_
包含上一个命令行的最后一个参数有关这些的更多信息,请查找bash
联机帮助页的“Readline 命令名称”部分。
例如:
cat foo/is/a/very/long/path/to/bar.c
rm $_
Run Code Online (Sandbox Code Playgroud)
如果您精通 vi,则可以使用命令在 bash(大多数 shell?)中激活 vi 绑定set -o vi
。然后,您可以使用普通的 vi 键来编辑您的命令。在您的第一个示例中,您可以^wcw删除“diff”,然后将其更改为结帐。
仅仅为了编辑命令行而学习 vi 键绑定可能不值得,但如果您已经了解它们,它会大大提高生产力。
有很多方法可以给这只猫剥皮!
要替换特定字符串,^old^new^extra
将采用您之前的命令,替换old
为new
,然后追加extra
。您可以随时停止;eg^old
将替换old
为空字符串并附加空字符串(本质上是删除old
并且什么也不做)。
1. ^diff^checkout
2. ^cat^rm
Run Code Online (Sandbox Code Playgroud)
特别有用的变体:
for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo
Run Code Online (Sandbox Code Playgroud)
要替换特定的单词,您可以使用通过命令!m:n-p
来引用单词(使用负数从当前命令开始倒数)。您可以省略部分以引用单个单词,也可以省略部分以引用整个命令。特殊形式为,为前一个命令的最后一个字,并为参数(所有,但字上一个命令的)都非常方便。n
p
m
-p
:m-p
!!
!-1
!$
!*
0
1. !!:0 checkout !!:2-
2. rm !*
Run Code Online (Sandbox Code Playgroud)
我经常使用这两种方法;zsh 在这里特别好,因为点击选项卡将扩展神秘的东西以确保你做对了。
通过行编辑也有很多方法可以做到这一点。阅读您的 shell 的键绑定。