tsx81429 发表于 2022-12-15 19:37:37

Shell 标准输入和输出

无论是要交给程序处理的数据,还是控制脚本的简单命令,都少不了输入和输出。程序要做的第一件事就是处理如同一阴一阳的“输入与输出”。
1 、从文件获取输入

当我们希望向文件输出内容时,我们可以通过符号 > 或 >> 实现。而用代表输入重定向的符号 <可以从文件中读取数据,如下:
$ wc < my.file之所以选择这种形状的操作符号,原因在于它们可以从视觉上提示重定向的方向。
很多 shell 命令可以接受一个或多个文件名作为参数,但如果没有给出文件名,命令就会从标准输入读取。使用这种命令时,可以采用command filename 或者 command < filename,这两种形式的结果没什么区别。在这个例子中,wc 是这样,换作 cat 或其他命令,也是如此。
2、将数据与脚本存放在一起


< 可以从文件读取数据,当你需要获得脚本输入,但又不想用单独的文件时,使用 &1其中,myprogram是准备向 STDERR 和 STDOUT 生成输出的程序。
&> 和 >& 只是将 STDOUT 和 STDERR 发送到相同地方的便捷写法。
8、追加输出

每次重定向输出,都会产生一个全新的输出文件。如果想要两次(或三次、四次……)重定向输出,同时又不想破坏之前的输出,该怎么办呢?
在 bash 的重定向符号中,双大于号(>>)表示追加输出:
# 下面是here-document
grep $1 <<EOF

mike x.123

joe x.234

sue x.555

pete x.818

sara x.822

bill x.919

EOF如果存在同名文件,第一行中的重定向会将其截断,并将 ls 命令的输出保存在这个已被清空的文件中。
后两次调用 ls 时使用了双大于号(>>),表示向输出文件中追加内容,而不是覆盖其原有内容。
如果想要同时重定向错误消息(STDERR),可以将 STDERR 的重定向放在后面,如下所示:
$ ./ext.sh bill
# 输出以下内容
bill x.919在 bash 4 中,你可以将这两个重定向合二为一:
# 简单地查找慷慨的捐赠人

grep $1 <<EOF

pete $100

joe $200

sam $ 25

bill $ 9

EOF该命令会重定向 STDERR 和 STDOUT,并将两者追加到指定文件中。& 符号必须先出现,且这 3 个字符之间不能有空格
9、丢弃输出

你有时不想将输出保存到文件中或者有时甚至不想看到输出。如我们在查找某个文件时,忽略那些没有权限的提示,如下图:
https://img2023.cnblogs.com/other/2893049/202212/2893049-20221215144552281-1527118061.png
此时,我们可以将输出重定向到 /dev/null,如下所示:
$ ./donors.sh bill

pete bill00

bill $ 9

$ ./donors.sh pete

pete pete00其实,你可以将不想要的输出重定向到文件,然后再将其删除。但还有一个更简单的方法。Unix 和 Linux 系统都存在一个特殊设备,该设备并非真实的硬件,而仅仅是一个位桶(bit bucket),我们可以将不需要的数据都扔进去。它就是 /dev/null,非常适用于此类场景。写入其中的数据会被直接丢弃并不会占用磁盘空间,重定向很容易做到这一点。示例中,只有发往标准错误的输出被丢弃了
本文由传智教育博学谷教研团队发布。
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。
转载请注明出处!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Shell 标准输入和输出