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脚本中非常重要的特性。通过重定向,我们可以方便地处理命令的输入和输出,包括错误消息。
测试