bash 历史记录
大多数Bash历史记录快捷方式指南都详尽列出了每个可用的清单。 这样做的问题是,我将只使用一次快捷方式,然后在尝试所有可能性时将其封闭。 然后,我将进入工作日并完全忘记它们,只保留著名的!! 我第一次开始使用Bash时学到的技巧 。
因此,大多数人从未致力于记忆。
实际使用每一天。 它基于我的书中的一些内容, “艰难地学习Bash” ; (您可以阅读预览以了解更多信息)。当人们看到我使用这些快捷方式时,他们经常问我:“您在那做什么?!” 只需很少的精力或智力,但是要真正学习它们,我建议一周使用每天一次,然后再转到下一个。 值得花时间让它们落在您的指尖,因为从长远来看,节省的时间将很重要。
1.“最后一个参数”之一:!$
如果您仅从本文中选择一种捷径,请使其成为本文的一种。 它会将最后一个命令的最后一个参数替换为您的行。
考虑这种情况:
$
mv
/ path
/ to
/ wrongfile
/ some
/ other
/ place
mv: cannot
stat
'/path/to/wrongfile' : No such
file or directory
算了 ,我在命令中输入了错误的文件名。 我应该改用rightfile 。
您可能决定重新键入最后一个命令,并用rightfile完全替换错误的文件。 相反,您可以键入:
$
mv
/ path
/ to
/ rightfile
! $
mv
/ path
/ to
/ rightfile
/ some
/ other
/ place
该命令将起作用。
在Bash中还有其他方法可以通过快捷方式实现相同的目的,但是重用last命令的last参数的技巧是我使用最多的。
2.“第n个参数”之一:!:2
曾经做过这样的事情吗?
$
tar
-cvf afolder afolder.tar
tar: failed to open
像许多其他人一样,我对tar (和ln )的争论比我想承认的更经常发生。
当您像这样混合参数时,可以运行:
$
! :
0
! :
1
! :
3
! :
2
tar
-cvf afolder.tar afolder
这样您的声誉就会被保存。
最后一个命令的项目索引为零,并且可以用!:之后的数字代替。
显然,您也可以使用它来重用上一个命令中的特定参数,而不是所有参数。
3.“所有参数”之一:!:1- $
想象一下,我运行如下命令:
$ grep '(ping|pong)' afile
论点是正确的; 但是,我想在文件中匹配ping或pong ,但是我使用了grep而不是egrep 。
我开始输入egrep ,但是我不想重新输入其他参数。 因此,我可以使用!:1 $快捷方式询问上一个命令的所有参数,从第二个(记住它们的索引为零)到最后一个(由$符号表示)。
$
egrep
! :
1 -$
egrep
'(ping|pong)' afile
ping
您无需选择1- $ ; 您可以选择一个子集,例如1-2或3-9 (如果上一个命令中有那么多参数)。
4.“最后一个但n个 ”之一:!-2:$
当我立即知道如何更正我的上一条命令时,上面的快捷键非常有用,但是通常我在原始命令之后运行命令,这意味着最后一条命令不再是我要引用的命令。
例如,使用之前的mv示例,如果我通过对文件夹内容的ls检查来跟踪错误:
$
mv
/ path
/ to
/ wrongfile
/ some
/ other
/ place
mv: cannot
stat
'/path/to/wrongfile' : No such
file or directory
$
ls
/ path
/ to
/
rightfile
我不能再使用!$快捷方式了。
在这些情况下,我可以在!之后插入a - n :(其中n是要在历史记录中返回的命令数) 。 从旧命令中获取最后一个参数:
$
mv
/ path
/ to
/ rightfile
! -
2 :$
mv
/ path
/ to
/ rightfile
/ some
/ other
/ place
同样,一旦学习了它,您可能会惊讶于您需要它的频率。
5.“给我文件夹”:!$:h
从表面上看,它看起来不太理想,但我每天都要使用数十次。
想象一下,我运行这样的命令:
$
tar
-cvf system.tar
/ etc
/ system
tar:
/ etc
/ system: Cannot stat: No such
file or directory
tar: Error
exit delayed from previous errors.
我可能要做的第一件事是转到/ etc文件夹,查看其中的内容并找出我做错了什么。
我可以使用以下方法来做到这一点:
$
cd
! $:h
cd
/ etc
这个人说:“获取最后一个命令( / etc / system )的最后一个参数,并删除其最后一个文件名组件,仅保留/ etc。 ”
6.“当前行”之一:!#:1
多年以来,我偶尔想知道是否可以在最后查找并学习之前在当前行引用一个自变量。 我希望我早就这样做了。 我最常使用它制作备份文件:
$
cp
/ path
/ to
/ some
/
file
!
#:1.bak
cp
/ path
/ to
/ some
/
file
/ path
/ to
/ some
/ file.bak
但是一旦触手可及,它可以快速替代……
7.“搜索并替换”一个:!!:gs
这将搜索所引用的命令,并将前两个/字符替换为后两个。
假设我想告诉世界我的s键无效,而是输出f :
$
echo my f key doef not work
my f key doef not work
然后我意识到我只是偶然地按下了f键。 要将所有f s替换为s es,我可以输入:
$
!! :gs
/ f
/ s
/
echo my s key does not work
my s key does not work
它不只对单个字符起作用; 我也可以替换单词或句子:
$
!! :gs
/ does
/ did
/
echo my s key did not work
my s key did not work
测试出来
只是为了向您展示如何组合这些快捷方式,您能算出这些趾甲剪报将输出什么吗?
$
ping
!
#:0:gs/i/o
$
vi
/ tmp
/! :
0 .txt
$
ls
! $:h
$
cd
! -
2 :h
$
touch
!
$! -
3 :$
!!
! $.txt
$
cat
! :
1 -$
结论
对于日常的命令行用户,Bash可以作为快捷方式的优雅来源。 尽管有成千上万的技巧要学习,但这些是我经常使用的收藏夹。
如果您想更深入地了解Bash可以教给您的全部知识,收拾我的书, 艰苦学习Bash或查看我的在线课程Master Bash shell 。
本文最初发布在Ian的博客Zwischenzugs.com上 ,并在获得许可的情况下可以重复使用。
翻译自: https://opensource.com/article/19/10/bash-history-shortcuts
bash 历史记录