
Linux的命令行中除了常用的指令,还有重定向、管道这样的技巧,让简单的命令可以发挥更大的威力。同时,一些shell的快捷键也会在本文中展示。
重定向
重定向一般用于将程序的标准输入(stdin)/标准输出(stdout)/标准错误(stderr)改为某个文件,这三个IO流作为文件描述符的编号分别为0,1,2
重定向在很多场合下威力强大,但不要轻易尝试在命令之间使用
输出重定向
stdout
>:
A > B,会将程序A的stdout改为文件B文件B不存在则创建之,所以
> B可以创建文件>>:
A >> B,文件B采用追加写的方式打开
stderr
- 2>:
A 2> B,将程序A的stderr改为文件B - 2>>:
A 2>> B,文件B采用追加写的方式打开
- 2>:
合并输出
通用:
ls -l /bin/usr > ls-output.txt 2>&1这里
&[N]表示重定向到的目标,是一个文件描述符(专指三个标准IO流),从而将stderr重定向到了stdout上反之,先修改stderr指向具体文件,再修改stdout指向stderr同样奏效,注意先后
同样的,要追加写的话,第一步重定向到具体文件时>>指定即可
bleeding edge:
ls -l /bin/usr &> ls-output.txt这里
&>表示将stdout和stderr组合,并重定向到同一个文件同理,如果要追加写,使用
&>>即可
抛弃stdout/stderr
- 重定向到/dev/null,沿袭自UNIX的古老的比特垃圾桶
输入重定向
<:A < B,会将程序A的stdin改为文件B
管道
将前一个程序的标准输出用管道传输给下一个程序作为标准输入,组合命令来实现强大的功能
使用:command | command……
这样的命令,在处理数据时也被称为filter,并可以通过tee命令来查看中间结果
快捷键
下面是一些linux的shell中可以用到的快捷键,来加速命令的输入与修改。事实上,快捷键这种东西和shell的具体实现有关,这里使用linux大多数发行版默认的bash,它使用Readline库实现,并能正确响应这些快捷键操作
除了熟悉的Ctrl,Alt键也大有作为,它相当于Readline库理解的旧时的Meta Key,而且它做前缀的快捷键粒度一般比Ctrl粗。一个冷知识是,Linux下的Esc只要一用一松开,可以当作Alt键来使用shell快捷键
移动光标
Ctrl+a/e:ahead/end,行级f/b:forward/backward,字符级l:clear,屏级
Alt+f/b:forward/backward,词级
编辑
Ctrl+d:delete,字符级注意:
- 如果键盘输入传给其他程序而非shell,一般会被理解成EOF
- 在空行使用还可以关闭终端会话
t:transpose,字符级
Alt+t:transpose,词级u/l:uppercase/lowercase,后半词级
剪切
在Readline中,将常用的剪切/粘贴(cut/paste)命名为kill/yank
Ctrl+k/u:kill/upside-kill,半行级y:yank
Alt+d/Backspace:kill-word-forward/kill-word-backward,半词级
自动补全
按一下Tab键,即可在许多情景下,让shell尝试命令的自动补全
如果这个补全是有歧义的,则按两下Tab可以显示所有可行的补全项
Alt+?:显示所有可行的补全项*:输入所有可行的补全项,在某些多文件参数命令中很有用
命令历史
除了history命令可以展示记录的命令行历史输入,也可以使用快捷键来利用这些历史记录
Ctrl+p/n:prevois/next历史条目r:reverse incremental search,反向,而且是带提示符的增量搜索,搜索到后Ctrl+j可以执行之o:operate,不带提示符找到某一条历史条目后,执行之,并跳转到下一条,来重复执行指令序列
Alt+</>:转到第一条/最后一条(也就是刚输入的命令)历史条目p/n:非增量反向/前向搜索(后半个似乎经常失灵),带提示符,相较而言不常用