-
举例
#cat test.sh [查看test.sh 文件] eat=("面呈牛王" "呷浦呷浦" "相当里手" "十六味" "群生记") check=$[$RANDOM*10/32767+1] echo "your may eat ${eat[${check}]}" #cat test_error.sh [查看test_error.sh 文件] i am an error shell #cat log.txt [log.txt文件] i am first line #sh test.sh [执行脚本时会把输出的结果输出到屏幕] your may eat 喜家德水饺 #sh test_error.sh [执行脚本时会把输出的错误输出到屏幕] test_error.sh: line 1: i: command not found #sh test.sh > log.txt [执行脚本时会把输出的结果输出重定向到log.txt文件 "覆盖"原有的文件内容] #cat log.txt your may eat 呷浦呷浦 #sh test.sh >> log.txt [执行脚本时会把输出的结果输出重定向到log.txt文件 "追加"原有的文件内容] #cat log.txt your may eat 呷浦呷浦 your may eat 十六味 #sh test_error.sh >> log.txt test_error.sh: line 1: i: command not found [执行脚本时不会把错误重定向到 log.txt文件] #sh test_error.sh >> log.txt 2>&1 [执行脚本时会把错误也重定向到log.txt文件] #cat log.txt your may eat 呷浦呷浦 your may eat 十六味 test_error.sh: line 1: i: command not found
-
2>&1说明
很多人只知道这样写是把错误也重定向到制定文件 但是却并不知道为什么是这么写 所以很多时候全靠背下来时间久了就忘记了 之前我就是这样哈哈哈
其实每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。
我们在 test.sh 最后一行加上sleep 10#sh test.sh [执行] #ps -ef | grep test.sh [找到执行test.sh 进程的id 26222] makx 26222 24961 0 11:45 pts/13 00:00:00 sh test.sh makx 26336 25775 0 11:46 pts/23 00:00:00 grep --color=auto test.sh ll /proc/26222/fd [根据pid查看程序打开的文件描述符] 总用量 0 lrwx------ 1 makx makx 64 12月 4 11:46 0 -> /dev/pts/13 lrwx------ 1 makx makx 64 12月 4 11:46 1 -> /dev/pts/13 lrwx------ 1 makx makx 64 12月 4 11:46 2 -> /dev/pts/13 lr-x------ 1 makx makx 64 12月 4 11:46 255 -> /home/makx/test.sh #sh test.sh > log.txt [执行] #ps -ef | grep test.sh [找到执行test.sh 进程的id 6437 ] makx 6437 2726 0 13:56 pts/9 00:00:00 sh test.sh makx 6440 2586 0 13:56 pts/7 00:00:00 grep --color=auto test.sh #ll /proc/6437/fd [根据pid查看程序打开的文件描述符] 总用量 0 lrwx------ 1 makx makx 64 12月 4 13:56 0 -> /dev/pts/9 l-wx------ 1 makx makx 64 12月 4 13:56 1 -> /home/makx/log.txt lrwx------ 1 makx makx 64 12月 4 13:56 2 -> /dev/pts/9 lr-x------ 1 makx makx 64 12月 4 13:56 255 -> /home/makx/test.sh #sh test.sh > log.txt 2>&1 [执行] #ps -ef | grep test.sh [找到执行test.sh 进程的id 3159 ] makx 3159 2726 0 13:51 pts/9 00:00:00 sh test.sh makx 3323 2586 0 13:51 pts/7 00:00:00 grep --color=auto test.sh #ll /proc/3159/fd [根据pid查看程序打开的文件描述符] 总用量 0 lrwx------ 1 makx makx 64 12月 4 13:51 0 -> /dev/pts/9 l-wx------ 1 makx makx 64 12月 4 13:51 1 -> /home/makx/log.txt l-wx------ 1 makx makx 64 12月 4 13:51 2 -> /home/makx/log.txt lr-x------ 1 makx makx 64 12月 4 13:51 255 -> /home/makx/test.sh
会发现 在加上> 或者>> 后文件描述符1指向了 /home/makx/log.txt ,在加上2>&1 之后 文件描述符2 指向了1指向的地方也是 /home/makx/log.txt (不能用1是应为会把1当成普通文件 &1指的不是普通文件 而是文件描述符) 现在明白了吗 ?
其实linux里好多命令都不需要硬背下来 找到其中的规律会觉得更有意思 哈哈 挺好玩的
参考
编程珠玑公众号