最近经常与linux打交道,刚开始使用时不太熟悉,要频繁查阅资料,且容易遗忘命令的用法,因此做个记录方便自己日后翻看。
合并输入、输出重定向
cat <src > dst
这里src内容将会放入dst中,若dst原本存在内容,则会被从头截断。
和cp不同,cp是复制,且会将src的inode属性复制到dst上。
文件描述符:标准输入0、标准输出1、标准出错2
Bash Shell和POSIX shell允许用户将文件描述符关联到文件上(TC shell不行)
如cat 0< file,将file关联到标准输入
command 2> error-file,将标准出错关联到error-file上。
注:TC shell中符号>&将标准输出和标准出错重定向到文件中
如果想要拆分标准输出和标准出错,可结合子shell使用。子shell只有在整个命令被处理后才建立起来。
如(command > output) >& error,此时先将子shell的输出被重定向至output,而错误信息则因为父shell的重定向关系送到error中。
命令行解析中,文件重定向顺序从左到右,若想将标准输出和标准出错同时重定向到同一个文件中,需要先将标准输出/错误重定向到指定文件,然后使标准错误/输出的文件描述符成为标准输出/错误的文件描述符
如:cat content 1>output.error 2>&1,效果等于cat content 2>output.error 1>&2,此时不能先2>&1 或 1>&2,这样标准错误或输出仍是显示屏。
由于重定向操作从左到右执行,以 command 1>out 0<input 2>error为例,输入文件Input找不到时,由于未执行到2>error,错误信息仍然会送到显示器中。
不覆盖文件内容的重定向
,>-->>,TCshell中相应有>>&
相反,强制覆盖符为>|,使用前可能需要set -o noclobber或set -c noclobber
管道
管道允许用户将一条命令的标准输出作为另一条命令的标准输入,用管道连接的命令叫做过滤器,管道用|构建
例:ls -l | more,ls-l输出作为more的输入
TC Shell中相应地使用|&,是将标准输出和标准出错同时重定向到下一条命令
管道在内存中实现,并没有使用到磁盘。如果使用文件作为辅助,则可能要用到辅助存储设备,降低效率。
在shell命令层中只能实现命令(进程)的单向通信,双向通信需要在C/C++等编程中实现双向通信。
区别:
用;隔开不同的命令时,不同命令之间独立顺序执行
用&连接命令时,不同命令之间独立并行执行,注意后面跟了&的命令是在后台执行的,两个&之间的所有命令用同一个进程执行
命令组:在同一个进程中顺序执行的一组命令
若有嵌套命令组,则命令组的执行顺序可能会和进程调度相关,不一定按命令输入顺序执行。用()套起来的嵌套命令在子shell下执行。
在管道中使用重定向
管道中若想将标准输出重定向到文件后,便不能再作为后一条命令的标准输入了。若想将重定向后的文件连接到后续命令的标准输入中,可结合tee工具使用。
use. tee [options] file-list
parameter
-a 追加
-i 忽略中断
此时,command1 | tee file1 ... file N | command2
便实现了将command1的标准输出送入到file1-fileN中,并将其作为command2的标准输入