关闭文件描述符

当脚本退出时,文件描述符将自动关闭。
如果要关闭文件描述符,请将文件描述符重定向到此符号&,它将关闭。

#!/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
shell脚本 输入,输出和重定向

抑制命令输出

有时你不想看到任何输出。
我们将输出重定向到空设备,即/ 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
日期:2020-07-15 11:16:34 来源:oir作者:oir