You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
如果想重定向错误和正常输出,必须用两个重定向符号,需要在符号前面放上待重定向数据所对应的文件描述符,然后指向用于保存数据的输出文件;ls -al test test1 test2 test3 testbad 2> test6 1>test7;如果愿意,也可以将STDERR和STDOUT的输出重定向到同一个输出文件,为此bash shell提供了特殊的重定向符号&>;ls -al test test2 test3 test4 badtest &> test7:当使用&>符时,命令生成的所有输出都会被发送到同一位置,包括数据和错误,不是按照顺序传入到文件的,先放STDERR数据,bash shell自动赋予了错误消息更高的优先级,这样你能够集中浏览错误信息;
在脚本中重定向输出
两种方法在脚本中重定向输出:临时重定向行输出;永久重定向脚本中的所有命令;
临时重定向
如果有意在脚本中生成错误消息,可以将单独的一行输出重定向到STDERR,你所需要做的是使用输出重定向符来将输出消息重定向到STDERR文件描述符,在重定向到文件描述符时,你必须在文件描述符数字之前加一个&;echo "this is an error message" >&2:这行会在脚本的STDERR文件描述符所指向的位置显示文本,而不是通常的STDOUT;echo "this is an error" >&2;echo "this is normal output";如果像平常一样运行脚本你可能看不出什么区别(记住:默认情况下,Linux会将STDERR导向STDOUT,但是,如果你在运行脚本时重定向了STDERR,脚本中所有导向STDERR的文本就会被重定向);
永久重定向
你可以用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符
echo 1>testout
echo "this is a test of redirecting all output"
echo "from a script to another file"
echo "without having to redicted every individual line"
echo 2>testerror
echo "this is the start of the script"
echo "now redirecting all output to another location"
exec 1>testout
echo "this out should go to the testout file"
echo "but this should go to the testerror file" >&2
exec 3>testout //将文件描述符3重定向到另一个文件
echo "this should display on the monitor"
echo "and this should be stored in the file" >&3 //被输出到文件中了
echo "then this should be back on the monitor"
exec 3>&1 将文件描述符3重定向到文件描述符1的当前位置也就是STDOUT,这就意味着任何发送给文件描述符3的输出都将会显示在显示器上
exec 1>testout 将STDOUT重定向到文件,shell现在会将发送给STDOUT的输出直接重定向到输出文件中,但是文件描述符3仍然制定的是STDOUT原来的位置,也就是显示器,如果此时将输出数据发送到文件描述符3它仍然会出现在显示器上
echo "this should store in the output file"
echo "along with this line."
exec 1>&3
echo "now things should be back to normal"
exec 6<&0
exec 0<testfile
count=1
while read line
do
echo "line #$count:$line"
count=$[ $count + 1 ]
done
echo 0<&6
read -p "are you done now?" answer
case $answer in
Y | y) echo "goodbye";;
N | n) echo "sorry this is the end";;
esac
exec 3<> testfile exec命令将文件描述符3分配给文件testfile以进行文件读写
read line <&3 通过分配好的文件描述符,使用read命令读取文件中的第一行
echo "read:$line" 将读取的第一行显示在STDOUT上
echo "this is a test line" >&3 用exec语句将一行数据写入到同一个文件描述符打开的文件中
可以将STDERR重定向到一个叫做null文件的特殊文件,null文件里什么都没有,shell输出到null文件的任何数据都不会保存,全部都被丢掉了;在Linux系统上null文件的标准位置是/dev/null,重定向到该位置的任何数据都会被丢掉,不会显示。:ls -al badfile test 2> /dev/null;可以在输入重定向中将/dev/null作为输入文件,由于/dev/null文件不包含任何内容,程序员通常用它来快速清除现有文件中的数据,而不用先删除文件再重新创建:cat /dev/null >testfile;
记录消息
将输出同时发送到显示器和日志文件,不用将重定向两次,只要使用tee命令即可;tee命令相当于管道的一个T型接头,它将从STDIN过来的数据同时发送两处STDOUT;tee命令行所指定的文件名;由于tee会重定向来自STDIN的数据,可以用它配合管道命令来重定向命令输出:date | tee testfile;默认情况下,tee命令会在每次使用时覆盖输出文件的内容,如果想将数据追加到文件中可以使用-a选项:date | tee -a testfile;
tempfile=$(mktemp test.XXXXXX)
exec 3>$tempfile
echo "this is script writes to temp file $tempfile"
echo "this is the first line" >&3
echo "this is the second line" >&3
echo "this is the last line" >&3
exec 3>&-
echo "done creating tempfile the contents are:"
cat $tempfile
rm -rf $tempfile 2>/dev/null
tempfile=$(mktemp -t tmp.XXXXXX)
echo "this is a test file" >$tempfile
echo "this is the second line of the test" >>$tempfile
echo "the tempfile is locate at : $tempfile"
cat $tempfile
rm -rf $tempfile
创建临时目录
-d选项告诉mktemp命令来创建一个临时目录(在当前所在目录下);如:
tempfile=$(mktemp -d dir.XXXXXX)
cd $tempfile
tempfile1=$(mktemp temp.XXXXXX)
tempfile2=$(mktemp temp.XXXXXX)
exec 7>$tempfile1
exec 8>$tempfile2
echo "sending data to dictory $tempfile"
echo "this is a test line of data for $tempfile1" >&7
echo "this is a test line of data for $tempfile2" >&8