Shell 标准输入和输出

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

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

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


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

每次重定向输出,都会产生一个全新的输出文件。如果想要两次(或三次、四次……)重定向输出,同时又不想破坏之前的输出,该怎么办呢?
在 bash 的重定向符号中,双大于号(>>)表示追加输出:
  1. # 下面是here-document
  2. grep $1 <<EOF
  3. mike x.123
  4. joe x.234
  5. sue x.555
  6. pete x.818
  7. sara x.822
  8. bill x.919
  9. EOF
复制代码
如果存在同名文件,第一行中的重定向会将其截断,并将 ls 命令的输出保存在这个已被清空的文件中。
后两次调用 ls 时使用了双大于号(>>),表示向输出文件中追加内容,而不是覆盖其原有内容。
如果想要同时重定向错误消息(STDERR),可以将 STDERR 的重定向放在后面,如下所示:
  1. $ ./ext.sh bill
  2. # 输出以下内容
  3. bill x.919
复制代码
在 bash 4 中,你可以将这两个重定向合二为一:
  1. # 简单地查找慷慨的捐赠人
  2. grep $1 <<EOF
  3. pete $100
  4. joe $200
  5. sam $ 25
  6. bill $ 9
  7. EOF
复制代码
该命令会重定向 STDERR 和 STDOUT,并将两者追加到指定文件中。& 符号必须先出现,且这 3 个字符之间不能有空格
9、丢弃输出

你有时不想将输出保存到文件中或者有时甚至不想看到输出。如我们在查找某个文件时,忽略那些没有权限的提示,如下图:

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表