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
:非增量反向/前向搜索(后半个似乎经常失灵),带提示符,相较而言不常用