随着优雅、全功能的集成开发环境的出现,开发者与命令行的互动越来越少。当您可以通过漂亮的用户界面安装包或管理文件时,为什么还需要一堆过时的shell技巧呢?但如果您曾遇到无法通过高级IDE解决的问题,就会明白拥有这些工具的重要性。
在本文中,我们将介绍一些简单但极其有效的shell快捷方式和命令。使用这些技巧,您可以快速解决错误、更快地运行命令,并以最小的努力执行搜索。
1、倒序搜索历史记录
这是您可以利用shell历史记录运行之前执行过的命令的最快方法之一。如果您在记得之前运行的命令时感到困难(您并不孤单),简单地滚动浏览您的历史记录不会是一种有效的方式。
这就是倒序搜索的用途。使用这个工具,您可以快速搜索您的shell历史记录,然后快速执行它们。您不必烦恼通过历史记录进行grep搜索或复制粘贴命令。
假设我很久以前运行了以下命令:
echo “linuxmi.com”
现在已经过了一段时间,我无法完全记住我使用的单词。如果我想使用倒序搜索,我可以按Ctrl + R,然后进入搜索提示符并输入 linuxmi.com:
(reverse-i-search)`linuxmi.com’: echo “foobar”
当您开始在搜索栏中输入时,它将自动填充结果。当您想要的结果出现时,只需按回车键即可运行命令。简单、快速、简便。
2、执行历史记录中的特定命令
这是一种稍微不同的利用shell历史记录的方式。当您运行普通的history命令时,您会得到一个您运行过的命令列表。旁边是ID号码,它们对应每个命令执行的顺序:
1htop
......
95 top
96 echo "www.linuxmi.com"
97 lynx
98 uname -a
99 neofetch
100 uname -a
101 history
使用这些ID号码,您可以重新运行历史记录中列出的任何命令。您只需在数字前面加上一个感叹号(惊叹号)即可,像这样:
!99
当您运行此命令时,您将执行在ID号码99处存储的任何命令。在本文中,它将运行neofetch命令。
这是一种非常方便的方式,可以回顾历史记录并执行任何您想要重新运行的较长命令。您还可以在shell脚本中聪明地使用它。
3、再次运行上一个命令
这很简单,但却非常有用。如果您想重新运行刚刚执行的最后一个命令,只需输入:
!!
看起来按上箭头然后按回车键会更容易,而且在大多数情况下确实如此。但是,也许您想运行一个新的代码片段,并在下一个命令中包含上一个命令的输出。您可以在括号中调用!!并嵌套命令来执行其他有趣的技巧:
linuxmi@linuxmi:~/www.linuxmi.com$ echo "linuxmi.com"
linuxmi@linuxmi:~/www.linuxmi.com$ echo -e "上一个命令是 $(!!)"
使用这种方法,您可以确保绝对引用最后执行的命令。不再需要重新输入或复制粘贴。
4、移动到长命令的开头或结尾
当您需要编写一个非常复杂的单行命令时,如果需要在开头或结尾进行编辑,那将是一种痛苦。幸运的是,还有一种快速的方法可以做到这一点。
如果您想要移动到命令的开头,您可以按下:
Ctrl + a
如果您想要移动到结尾,您可以按下:
Ctrl + e
这两个快捷键将使您不再需要按住箭头键来来回在一行内移动。
5、从光标位置删除字符
如果您仍在处理那个长的单行命令,删除其中的一小部分可能会很麻烦。特别是如果您需要删除线条中某个特定点之前或之后的所有内容。
对于这个确切的问题,也有一个 shell 快捷键。
如果您想要删除光标当前位置之前的所有内容,可以按下:
Ctrl + u
同样地,如果您想要删除光标后的所有内容,可以按下:
Ctrl + k
现在,您不必长时间按住退格键来修改一个冗长的命令。
6、检查命令
有时候,一个命令并不总是看起来那么简单。您在控制台中输入的命令在背后可能会被多种不同的进程或配置所操控。
举个例子,您可以为常用命令添加别名,以便在它们后面附加您喜欢的参数。比如,您可以像这样为 ls 添加额外的参数:
alias ls='ls -lah'
在这种情况下,当您输入 ls 并执行它时,您可能认为您只是运行了 ls,但实际上您运行的是带有隐藏参数的 ls。
如果您对某个特定命令感到怀疑,可以使用命令行工具 command 快速检查它:
command -V ls
ls is aliased to 'ls -lah'
当您使用 -V 参数运行 command 命令时,您可以看到实际执行的内容。在这个例子中,command 告诉我们实际上运行的是 ls -lah 而不仅仅是 ls。
7、在无限循环中运行一些命令
最后是一个经典的单行命令。这个代码片段允许您在一组命令之间以一个简短的延迟进行循环运行。如果您需要不断监视一个进程或在某些事件发生时发送一些警报,这将非常有帮助。
让我们使用一个简单的例子,它将运行一个循环,打印当前日期,然后休眠一秒钟:
linuxmi@linuxmi:~/www.linuxmi.com$ while true; do echo "$(date)"; sleep 1; done
这行代码由分号分隔,表示要执行多个命令或函数:
- 第一个命令是 while true,它将启动我们的无限循环。
- 接下来的命令是 do echo “$(date)”,它告诉 shell 在循环内运行此命令并将日期打印到控制台。
- 最后,我们休眠一秒钟,然后使用 done 结束循环。 由于循环以 true 作为条件开始,它将一直持续下去,直到您退出循环或按下 Ctrl + c。
在这个循环中,您可以将 echo 命令替换为任何您想要持续运行的命令。这可以是监听文件、检查文件是否存在,甚至进行一些简单的算术计算。最好的部分是您甚至不需要离开 shell 来执行任何操作。