cron 任务:
10 5 * * * /run/some/script > /dev/null 2 > &1
在这个例子中,所有的输出都会被发送到/dev/null中,无论是脚本本身产生的标准输出,还是Shell或者脚本命令产生的错误输出。
10 5 * * * /run/some/script 2 > &1 > /dev/null
注意,这个例子中
,并不能达到禁止所有输出的目的。任务的stderr 输出继续会通过电子邮件发送给用户。
10 5 * * * /run/some/script > /dev/null
它将去掉所有正常输出(即到stdout的输出),但是它不会重定向脚本产生的错误输出。实际上,这也许是最安全的句法,它转移了交互运行脚本的所有正常输出,但是当发生错误时,仍然会有输出警告用户。
- expression < file 将文件file的内容重定向给表达式。
- expression > file 将表达式的输出定向到指定文件file中,若file不存在,则会新创建,若file存在,则会覆盖掉原文件。
- expression >> file 将表达式的输出定向追加到指定文件file中,不会向上面expression > file一样覆盖掉原文件。
- expression 2 > /dev/null > file 将表达式的错误输出重定向到/dev/null中,同时将标准输出stdout重定向到指定文件file中。
- expression > /dev/null 2 > file 将表达式的标准输出stdout重定向到/dev/null中,同时将标准错误输出stderr重定向到指定文件file中,与上个句法相反。
- expression > file 2 > &1 将表达式的标准输出stdout和标准错误输出stderr都重定向到指定文件file中。
- expression &> file 将表达式的标准输出stdout和标准错误输出stderr都重定向到指定文件file中,是上个句法的简写版本。
- expression 2 > file 将表达式的标准错误输出stderr重定向到指定文件file中,例如
find /home -type -f -exec grep -l "some_string" {} \; 2 > /dev/null
这个例子会输出find命令找到的所有包含字符串"some_string“的文件名字,但是把任意”Permission Denied"错误重定向到/dev/null中。
文件代码:0,1,2,... <标准输入 > 标准输出 标准错误
系统默认指定这3个文件代码,这3个文件代码在建立Shell环境时就已经开启,往后如果需要开启新文件,则分配3以上的文件代码。
转向语义大部分不能单独使用,必须和Bash命令一起运用
操作文件:
fd<>文件 fd文件代码,可供读写
fd<&- 关闭输入文件
fd>&- 关闭输出文件
有时,操作系统已开启的文件代码(0 1 2),为了不影响原有文件代码的作用,最好先复制一份,等操作结束,再还原回去,这样的概念,称为“复制代码”。
n<&m 复制转向输入的文件代码m,存成文件代码n,使n连接至m
n>&m 复制转向输出的文件代码m,存成文件代码n,使n连接至m
用例1:
exec >&6
同于exec 1 >&6,将标准输出连接到文件代码6,因此,凡是原本出现在标准输出的内容,会转存至文件代码6.。
用例2:
exec <&6
同于exec 0<&6,将文件代码6的内容,转向至标准输入,而由cat把内容显示出来.。
用例3:
exec 5<&0
复制标准输入(0),存在文件代码5,即建立文件代码0的连接。简单来说,就是做标准输入的备份。
一旦备份好标准输入后,就可以对标准输入进行操作,如转向输入。操作完毕,接下来应该还原标准输入,方法如下:
exec 0<&5 5<&-
将存储在文件代码5的标准输入还原,并关闭文件代码5,这样,原标准输入的功能就不会受到影响。
也可以 分两行写:
exec 0<&5
exec 5<&-
转向的用法:
转向输入 fd<文件
转向输出 fd>文件 set -o noclobber set -C 不覆盖 fd>|文件 强制覆盖
转向附加 fd>>文件
标准错误伴随标准输出做转向:&>文件 或 >&文件
实际上,&>的作用,和以下写法相同:
>文件2>&1
即:转向输出至“文件”,标准错误代码2连接至标准输出1,其效用也等于
Here Document转向
fd<<标记
资料
...
...
标记
例子
#!/bin/bash
exec 6<<EOF
line1
line2
line3
EOF
while read <&6
do
echo$REPLY
done
结果