Shell脚本:输入输出重定向以及实例讲解

一、概述

在Linux系统中,每个正在运行的进程都会有三个默认的数据流:标准输入(编号为0),标准输出(编号为1),以及标准错误输出(编号为2)。它们通常与用户的终端连接,以接受用户的输入或向用户展示输出。然而,有时候我们希望改变这种默认设置--这时候就需要用到输入输出重定向。在本文中,我们将通过10个详尽的示例讲解在Shell脚本中如何进行输入输出重定向。


二、输出重定向

在Shell中,我们使用'>'和'>>'操作符来进行输出重定向。'>'用于覆盖已存在文件的内容,而'>>'则用于在已存在文件末尾追加内容。

实例1:将echo输出重定向到文件。

shell

echo "Hello, World!" > output.txt

此命令会将字符串"Hello, World!"重定向到output.txt文件中,相当于创建或者重写了output.txt文件,并将"Hello, World!"作为新的内容。

实例2:将ls命令的输出重定向到文件。

shell

ls -l > files.txt

此命令会将ls -l命令的输出结果重定向到files.txt文件中。

实例3:将错误输出重定向到文件。

shell

ls /nonexistdir 2> error.txt

此命令会将因目录不存在导致的错误信息重定向到error.txt文件中。


三、输入重定向

在Shell中,我们使用'<'操作符来进行输入重定向。我们可以将文件内容作为命令的输入。

实例4:将文件内容重定向为grep命令的输入。

shell

grep "Hello" < file.txt

此命令会将file.txt的内容作为grep命令的输入,搜索包含"Hello"的行。


四、管道操作符与列表操作符

管道操作符'|'常常用于将一个命令的输出作为另一个命令的输入,即“管道”。此外,我们还可以使用列表操作符'&&'和'||'进行操作。'&&'操作会在前一命令成功执行后继续执行下一个命令,'||'操作会在前一命令失败后才会执行下一个命令。

实例5:使用管道操作符将ls的输出作为grep的输入。

shell

ls -l | grep "txt"

此命令会列出当前目录的所有文件信息并寻找包含"txt"的行。

实例6:使用'&&'操作进行命令连接。

shell

cd /dir && ls

此命令会先尝试进入/dir目录,如果成功则继续执行ls命令,否则不会执行ls命令。

实例7:使用'||'操作进行命令连接。

shell

cd /nonexistdir || echo "Failed to change directory"

此命令会尝试进入/nonexistdir目录,如果失败则会输出"Failed to change directory"。


五、进程输入/输出重定向

我们可以利用文件描述符和操作符进行进程的输入和输出重定向。

实例8:错误输出和标准输出到同一文件

shell

ls /nonexistdir > out.txt 2>&1

此命令会将标准输出和错误输出都重定向到out.txt文件中。这在脚本化和日志记录中很有价值。

实例9:在后台运行进程并忽略所有输出

shell

./myprogram > /dev/null 2>&1 &

此命令将在后台执行myprogram,并忽略所有的输出(正常或错误)。

实例10:使用exec命令对所有命令进行重定向

shell

exec > logfile.txt
echo "This will be logged."

此命令会对所有的命令进行重定向,以下所有正常输出都将被写入到logfile.txt。

实例11:在find和tar命令间使用管道操作

生成备份是shell脚本的常见应用,使用find命令找到需要备份的文件,再通过管道传递给tar命令创建压缩包。

shell

find /path/to/dir -name "*.txt" -print | tar -cvzpf backup.tar.gz -T -

此命令将查找所有.txt文件,然后通过管道操作将这些文件传递给tar命令,生成名为backup.tar.gz的压缩包文件。

实例12:在grep和sort命令间使用管道操作

shell

cat myfile.txt | grep "Error" | sort

此命令将读取myfile.txt文件中包含"Error"的行,并对这些行进行排序。这是一个例子,展示了如何在多个命令间创建管道,生成可以立即使用的有用输出。

实例13:使用重定向操作符存储错误消息

shell

find / -name "myprogram" 2> errors.log

此命令将在整个文件系统中搜索名为"myprogram"的文件或目录,所有的错误输出,如"Permission denied"等,都会被重定向到errors.log文件中。

实例14:使用“Here Documents”

"Here Documents"是shell脚本中的一种特殊的重定向方式,它允许你在脚本中插入多行文本。

shell

cat << EOF > mymessage.txt
Hello,
This is a message.

Best Regards,
我是一个例子
EOF

此命令将在mymessage.txt文件中插入一段消息。

实例15:使用“Here Strings”

"Here Strings"是一个非常有用的功能,它可以允许我们将字符串作为命令的输入。例如,可以使用here string来提供sed命令的输入:

shell

sed 's/string1/string2/' <<< "string1"

此命令将字符串"string1"替换为"string2"。

实例16:临时忽略输出

有时候,我们可能并不关心某个命令的输出,可以暂时忽略它:

shell

echo "Start of script"

my_program >/dev/null 2>&1

echo "End of script"

此脚本将在运行my_program时忽略所有的输出(包括错误消息),只显示“Start of script”和“End of script”。


六、总结

输入输出重定向是Shell脚本中非常重要的特性。通过重定向,我们可以方便地处理命令的输入和输出,包括错误消息。

测试