默认情况下,大多数bash命令会将输出导向STDOUT文件描述符。
数据追加到某个文件用>> 符号来完成。
who
命令生成的输出会被追加到test2文件中已有数据的后面。
只重定向错误STDERR文件描述符被设成2。可以选择只重定向错误消息,将该文件描述符值放在重定向符号前。该值必须紧紧地放在重定向符号前。用这种方法, shell会只重定向错误消息,而非普通数据。
由于该命令将文件描述符2的输出( STDERR)重定向到了一个输出文件, shell会将生成的所有错误消息直接发送到指定的重定向文件中。
如果想 重定向错误和正常输出,必须用两个重定向符号。需要在符号前面放上待重定向数据所对应的文件描述符,然后指向用于保存数据的输出文件。
shell利用1>
符号将ls命令的正常输出重定向到了test7文件,而这些输出本该是进入STDOUT
的。所有本该输出到STDERR的错误消息通过2>
符号被重定向到了test6文件。
用特殊的重定向符号&>
将STDERR和STDOUT的输出重定向到同一个输出文件。
相较于标准输出, bash shell自动赋予了错误消息更高的优先级。
临时重定向
使用输出重定向符来将输出信息重定向到STDERR文件描述符。在重定向到文件描述符时,你
必须在文件描述符数字之前加一个&
:
这行会在脚本的STDERR文件描述符所指向的位置显示文本。
在脚本中重定向输入
exec命令允许你将STDIN重定向到Linux系统上的文件中:
exec 0< testfile
从文件testfile中获得输入,而不是STDIN。这个重定向只要在脚本需要输入时就会作用。
这个脚本用exec命令将文件描述符3重定向到另一个文件。当脚本执行echo语句时,输出内
容会像预想中那样显示在STDOUT上。但你重定向到文件描述符3的那行echo语句的输出却进入
了另一个文件。这样你就可以在显示器上保持正常的输出,而将特定信息重定向到文件中(比如
日志文件)。
也可以不用创建新文件,而是使用exec命令来将输出追加到现有文件中。
exec 3>>test13out
输出会被追加到test13out文件,而不是创建一个新文件。
临时重定向输出,然后恢复默认输出设置的常用方法。
首先,脚本将文件描述符3重定向到文件描述符1的当前位置,也就是STDOUT。这意味着任何发送给文件描述符3的输出都将出现在显示器上。第二个exec命令将STDOUT重定向到文件, shell现在会将发送给STDOUT的输出直接重定向到输出文件中。但是,文件描述符3仍然指向STDOUT原来的位置,也就是显示器。如果此时将输出数据发送给文件描述符3,它仍然会出现在显示器上,尽管STDOUT已经被重定向了。
在向STDOUT(现在指向一个文件)发送一些输出之后,脚本将STDOUT重定向到文件描述符
3的当前位置(现在仍然是显示器)。这意味着现在STDOUT又指向了它原来的位置:显示器。
创建输入文件描述符
exec 6<&0
exec 0< testfile
count=1
while read line
do
echo "Line #$count: $line"
count=$[ $count + 1 ]
Done
exec 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
文件描述符6用来保存STDIN的位置。然后脚本将STDIN重定向到一个文件。
read命令的所有输入都来自重定向后的STDIN(也就是输入文件)。
在读取了所有行之后,脚本会将STDIN重定向到文件描述符6,从而将STDIN恢复到原先的
位置。用另外一个read命令来测试STDIN是否恢复正常。这次它会等待键盘的输入。
在Linux系统上null文件的标准位置是/dev/null
。你重定向到该位置的任何数据都会被丢掉,
不会显示。
清除日志文件的一个常用方法,因为日志文件必须时刻准备等待应用程序操作。
Linux系统有特殊的目录,专供临时文件使用。 Linux使用/tmp目录来存放不需要永久保留的
文件。大多数Linux发行版配置了系统在启动时自动删除/tmp目录的所有文件。
系统上的任何用户账户都有权限在读写/tmp目录中的文件。这个特性为你提供了一种创建临
时文件的简单方法,而且还不用操心清理工作。
mktemp命令可以在/tmp目录中创建一个唯一的临时文件。
将输出同时发送到显示器和日志文件。用特殊的tee命令就行。
tee命令相当于管道的一个T型接头。它将从STDIN过来的数据同时发往两处。一处是
STDOUT,另一处是tee命令行所指定的文件名
可以用它配合管道命令来重定向命令输出。
在这里复习一下管道命令。
管道命令
在命令行环境下,管道命令(Pipeline)是一种非常有用的技术,它允许将多个命令连接起来,其中一个命令的输出作为另一个命令的输入。这样可以实现数据流的传递和处理,提高命令行的灵活性和效率。
在大多数类Unix系统(如Linux、macOS)中,管道命令使用竖线符号 |
表示。下面是一些常见的管道命令的示例:
-
简单的管道:
command1 | command2
这个命令将
command1
的输出作为command2
的输入。command1
执行完毕后,将其输出传递给command2
进行处理。 -
过滤和排序:
cat file.txt | grep "keyword" | sort
这个命令将
file.txt
文件的内容传递给grep
命令进行关键字过滤,然后将过滤结果传递给sort
命令进行排序。 -
统计命令输出:
ls -l | wc -l
这个命令将
ls -l
命令的输出传递给wc -l
命令进行行数统计,从而得到文件或目录的数量。 -
多重管道:
command1 | command2 | command3
这个命令将
command1
的输出传递给command2
,再将command2
的输出传递给command3
。可以通过多个管道命令连接多个命令。
通过使用管道命令,可以将多个简单的命令组合起来,实现更复杂的数据处理和操作。管道命令在命令行环境下非常灵活和强大,可以大大提高命令行的效率和便利性。