免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 17463 | 回复: 33
打印 上一主题 下一主题

shell怎么将输出到标准错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-08 21:58 |只看该作者 |倒序浏览
5可用积分
我写了一个脚本,里面的部分输出语句不想输出到标准输出,想输出到标准错误,这样别人用我的脚本重定向时才能在屏幕上看到这具错误信息

尝试将这些echo重定向到标准输出,但达不到效果
echo "hello" > &2 > test.txt

结果发现hello直接到了test.txt 里面了 跟我要的效果不一样

最佳答案

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2009-01-08 21:58 |只看该作者
原帖由 皇家救星 于 2009-1-8 22:59 发表
cmd > output.txt

这种情况需要本身cmd命令就会把错误提示传进标准错误,正确结果传进标准输出

例如我用shell写一个cat命令就不知道在源文件不存在的时候怎么将“源文件不存在”这一行信息传给标准错误
...


cat test.sh

  1. #!/bin/sh

  2. #write to stderr
  3. exec 4>&1    #dup 4 as stdout, i.e. backup stdout
  4. exec >&2     #redirect stdout as stderr
  5. echo "stderr, hello"
  6. echo "stderr, world"
  7. exec >&4     #restore stdout
  8. exec 4>&-    #close fd 4

  9. #write to stdout
  10. echo "stdout, hello world"
复制代码
$ ./test.sh
stderr, hello
stderr, world
stdout, hello world
$ ./test.sh >out
stderr, hello
stderr, world
$ cat out
stdout, hello world

论坛徽章:
0
3 [报告]
发表于 2009-01-08 22:00 |只看该作者
基本就是要找一个命令达到C里面fprintf(stderr, ...)的效果

论坛徽章:
0
4 [报告]
发表于 2009-01-08 22:03 |只看该作者

回复 #2 皇家救星 的帖子

echo "hello" > test.txt  2>&1  

是这个意思?

论坛徽章:
0
5 [报告]
发表于 2009-01-08 22:11 |只看该作者
手头没环境,LS可否解释一下语句?

我看着样子像是把标准输出定向到test.txt 把标准错误定向到标准输出

这样结果应该是标准错误和标准输出全都往test.txt里面去了 这跟我要的效果不一样

论坛徽章:
0
6 [报告]
发表于 2009-01-08 22:13 |只看该作者
例如脚本如下:

demo.sh:

echo stdout
echo stderr

我希望别人用demo.sh > file.txt后stderr不会出现在file.txt 而stdout则要出现在file.txt

论坛徽章:
0
7 [报告]
发表于 2009-01-08 22:21 |只看该作者

回复 #1 皇家救星 的帖子

http://www.wangchao.net.cn/bbsdetail_54222.html

看看这个能不能帮你。

论坛徽章:
0
8 [报告]
发表于 2009-01-08 22:33 |只看该作者
原帖由 皇家救星 于 2009-1-8 21:58 发表
我写了一个脚本,里面的部分输出语句不想输出到标准输出,想输出到标准错误,这样别人用我的脚本重定向时才能在屏幕上看到这具错误信息

尝试将这些echo重定向到标准输出,但达不到效果
echo "hello" > &2 > test.txt

结果发现hello直接到了test.txt 里面了 跟我要的效果不一样



依照shell从左往右的解释顺序
step 0: echo "hello"  命令执行的结果是标准输出'hello"
step 1: > &2 设置:将标准输出打印到stderr相同的地方e
step 2: >  test.txt   将标准输出重定向到文件 test.txt,于是你step 1中的设置没有任何用处

原帖由 皇家救星 于 2009-1-8 22:13 发表
例如脚本如下:

demo.sh:

echo stdout
echo stderr

我希望别人用demo.sh > file.txt后stderr不会出现在file.txt 而stdout则要出现在file.txt


你这里的两个echo都只有stdout,根本没有stderr,如果要实现你的要求,举例:

目录test下有一个文件:
$ cat foo
Hello world             #标准输出
$ cat bar                   # 文件bar是不存在的
cat: bar: No such file or directory    #标准错误
$ cat foo bar
Hello World            #标准输出
cat: bar: No such file or directory   #标准错误
$ cat foo bar > test.txt   #将标准输出从定向到文件test.txt,标准错误没设置,所以会默认打印到stderr(一般是终端),
                                               #所以你根本不用担心stderr会输出到文件test.txt里
cat: bar: No such file or directory          #标准错误被输出到stderr

$ cat test.txt
Hello World                         # 文件test.txt里只有命令执行结果的标准输出

[ 本帖最后由 wertyu 于 2009-1-8 22:37 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-01-08 22:39 |只看该作者
呵呵,lz想多了
demo.sh > file.txt
就可以了,2没指定,err是不会进去file.txt的

论坛徽章:
0
10 [报告]
发表于 2009-01-08 22:47 |只看该作者
如果demo.sh是这样
demo.sh:

echo stdout_info
echo stderr_info
demo.sh > file.txt 后file.txt里面肯定是有两行

但我现在不希望stderr_info出现在file.txt里面(stderr_info是我想输出的一些提示信息,而stdout_info才是真正执行脚本后的结果),因为echo是标准输出命令,所以想请教大家,用什么命令替换echo好?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP