关闭文件描述符
当脚本退出时,文件描述符将自动关闭。
如果要关闭文件描述符,请将文件描述符重定向到此符号&,它将关闭。
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>& echo "Nothing works" >&3
创建自定义重定向
我们知道有九个文件描述符,只使用其中3个输入,输出和错误。
剩下的六个文件描述符可用于输入和输出重定向。
我们可以使用exec命令为像这样的输出分配文件描述符:
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
创建输入文件描述符
要重定向输入文件描述符执行以下操作:
1将STDIN到另一个文件描述符。
2red向文件注明。
3返回其原始位置。
查看以下代码以了解以下步骤:
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
我们将stdin保存到文件描述符7,并将stdin重定向到文件。
在迭代文件行之后,STDIN恢复到其原始位置。
输出重定向
输出重定向有两种方法:
- 暂时重定向。
- 永久重定向。
临时重定向
对于临时重定向,我们可以使用这样的>&2符号:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
我们将看到两行,因为默认情况下错误转到屏幕。
我们可以将错误重定向到这样的文件:
./myscript 2> myfile
永久重定向
如果我们有很多数据需要重定向,则可以使用这样的exec命令具有永久重定向:
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
如果我们查看名为Outfile的文件,我们将看到回声线的输出。
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
抑制命令输出
有时你不想看到任何输出。
我们将输出重定向到空设备,即/ dev/null。
例如,我们可以抑制这样的错误:
ls -al badfile anotherfile 2> /dev/null
我们可以截断文件而不使用相同的命令完全删除它。
cat /dev/null > myfile
重定向错误和正常输出
要重定向错误和正常输出,必须在每个错误和正常输出之前使用适当的文件描述符,如下所示:
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
使用1>符号将LS命令结果发送到correctcontent文件。
使用2>符号将错误消息发送到errorcontent文件。
我们可以使用 &>
符号将正常输出和错误重定向到同一文件:
ls –l myfile xfile anotherfile &> content
标准文件描述符
一切都是Linux中的文件,它包括输入和输出。
每个进程都可以同时打开9个文件描述符。
文件描述符0,1,2保留用于BASH Shell使用情况。
0 stdin。
1 stdout。
2 stderr。
我们可以使用上述文件描述符来控制输入和输出。
Stdin
Stdin代表标准输入,默认情况下是键盘。
我们可以使用输入重定向符号(<)将数据替换为键盘并用文件替换它,将数据作为键盘键盘键入。
当我们输入没有任何内容的CAT命令时,它会接受STDIN的输入。
我们键入的任何行,CAT命令将该行打印到屏幕上。
stdout
STDOUT代表标准输出,默认情况下是屏幕。
我们可以使用>>符号将输出重定向到文件。
如果我们有文件包含数据,则可以使用这样的符号将数据追加到文件中:
pwd >> myfile
以下命令尝试使用>符号将输出重定向到文件。
ls –l xfile > myfile
STDERR
shell默认情况下向屏幕发送错误。
如果我们需要将错误重定向到日志文件而不是将其发送到屏幕,则可以使用重定向符号重定向错误。
重定向错误
我们可以通过将文件描述符2放在重启定向符号前,来重定向错误:
ls -l xfile 2>myfile
cat ./myfile
lsof命令
LSOF命令用于列出系统和后台进程上的所有打开的文件。
在许多Linux系统上,LSOF命令位于/ usr/sbin下。
这是LSOF命令的一些重要选项:
-p:用于进程ID。
-d:for文件描述符。
我们可以使用$$变量获取进程PID。
我们可以使用-a将-p选项和-d选项的结果组合。
现在,从脚本测试命令:
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
重定向输入
我们可以使用这样的exec命令重定向到文件而不是stdin:
exec 0< myfile
此命令告诉shell从名为myfile而不是stdin的文件中的输入,这是一个例子:
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done