让工作更轻松(并拯救理智)的 Shell 实用技巧
Hacker News 摘要原标题:Shell Tricks That Make Life Easier (and Save Your Sanity)
看着优秀的工程师为了修改行首的一个拼写错误而按住 Backspace 键长达六秒钟,这是一种让人心痛的经历。我们通常学习了 ls、cd 和 grep 后就停止探索了,却没意识到 shell 的开发者们早在二十世纪八十年代就解决了这些繁琐的操作。
以下是一些实用的 shell 技巧,分为通用技巧和针对 Bash 或 Zsh 的进阶技巧。
通用技巧
这些技巧适用于大多数遵循 POSIX 标准的 shell,无论是老旧的嵌入式路由器、OpenBSD 系统还是精简的 Alpine 容器。
替换退格键的操作
不要再一个字符一个字符地删除,使用这些 Emacs 风格的快捷键可以极大地提高效率:
• CTRL + W:立即删除光标前的一个单词。比起狂按退格键,这要快得多。
• CTRL + U 与 CTRL + K:如果你写了一长串命令但想先检查别的东西,按 CTRL + U 可以剪切从光标到行首的内容。检查完后,按 CTRL + Y 即可粘回。CTRL + K 则负责从光标处剪切到行尾。
• CTRL + A 与 CTRL + E:瞬间跳转到行首(A)或行尾(E),不需要去够键盘上遥远的 Home 或 End 键。
• ALT + B 与 ALT + F:以单词为单位向前(B)或向后(F)移动光标。
修复乱码输出
如果你不小心用 cat 命令打开了一个二进制文件或压缩包,终端可能会显示各种奇怪的符号甚至让提示符消失。此时即使看不见输入的字符,直接输入 reset(或 stty sane)并回车,终端就会恢复正常。
紧急出口与清理
• CTRL + C:立即取消当前命令。
• CTRL + D:发送 EOF 信号。如果命令行是空的,它会直接注销当前的 shell 会话。
• CTRL + L:清理屏幕。它会将当前提示符置于顶部,而不会中断你正在输入的命令,比输入 clear 命令更方便。
目录切换的高级玩法
• cd -:在当前目录和上一个目录之间快速切回,就像电视遥控器的返回键。
• pushd 与 popd:pushd 会切换目录并将路径存入堆栈,完成后输入 popd 即可回到最初的位置。
快速清空文件
使用 > file.txt 可以直接清空文件内容,且不删除文件。这种方式保留了文件权限和所有权,比先删除再创建更优雅,也不会产生多余的换行符。
获取最后一个参数
在大多数 shell 中,$_ 变量保存了上一个命令的最后一个参数。例如在你创建了一个长路径目录后,可以直接输入 cd "$_" 进入该目录。
脚本安全设置
在编写脚本时,在首行下方添加以下设置可以避免灾难:
• set -e:一旦出错立即退出脚本。
• set -u:引用未定义变量时报错,防止因拼写错误导致类似 rm -rf /usr/local/${MY_VAR}/* 变成清空系统目录的惨剧。
Bash 与 Zsh 进阶技巧
这些工具能让现代命令行环境更加顺手。
历史记录搜索
按下 CTRL + R 进行反向增量搜索。输入关键字即可找回以前执行过的复杂命令,再次按下 CTRL + R 可以继续向后循环搜索。
快速补权限
如果你输入了一个长命令却发现提示“权限不足”,输入 sudo !! 即可。 !! 会自动替换为上一条执行过的完整命令。
调出编辑器修改命令
如果你正在输入复杂的长命令(如多行 awk),按下 CTRL + X 接着按 CTRL + E,当前的命令会在默认文本编辑器(如 Vim 或 Nano)中打开。编辑并保存退出后,shell 会立即执行该命令。
交互式参数获取
• ESC + .(或 ALT + .):在光标处插入上一个命令的最后一个参数。连续按可以循环调出更早之前的参数。
• !$:在按下回车时会自动展开为上一个命令的最后一个参数。
大括号展开魔法
利用大括号可以避免重复输入:
• 备份文件:执行 cp pf.conf{,.bak} 会展开为 cp pf.conf pf.conf.bak。
• 修改后缀:执行 mv filename.{txt,md} 会展开为 mv filename.txt filename.md。
• 批量建目录:执行 mkdir -p project/{src,tests,docs}。
进程替换
使用 <(command) 可以将命令的输出当作文件来处理。例如,想比较两个未排序文件的内容,可以运行 diff <(sort file1.txt) <(sort file2.txt)。
终极通配符
在 Zsh 或开启了 shopt -s globstar 的 Bash 中,可以使用 ** 进行递归匹配。例如 ls **/*.js 可以找到当前目录及其所有子目录下的 JavaScript 文件。
后台运行与脱离
如果你启动了一个耗时任务却忘记使用 tmux,且担心断开 SSH 会导致任务停止,可以依次执行:
1. 按下 CTRL + Z 暂停进程。
2. 输入 bg 让它在后台继续运行。
3. 输入 disown 将其与当前 shell 脱离,之后即使关闭终端任务也会继续。
全能日志记录
使用 |& tee file.log 可以同时捕获标准输出和标准错误。其中 |& 是 2>&1 | 的简写,而 tee 则确保你在屏幕上看到输出的同时将其保存到日志文件中。
原文:https://blog.hofstede.it/shell-tricks-that-actually-make-life-easier-and-save-your-sanity/