关于shell的问题

2013-07-28 00:02:52 +08:00
 sdzbzyc
ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null && result=0 || result=1

请问,里面数据重定向输出到空设备后,返回的是什么?是执行0还是执行后面1

无论能不能ping通,都可以成功输出到空设备,那只有执行后面的0了,搞不明白
3498 次点击
所在节点    Linux
12 条回复
013231
2013-07-28 01:50:00 +08:00
你的理解是錯誤的. 重定向只是決定輸出到什麼地方, 並不會把失敗的命令變成成功的. 在這個例子中, 重定向不影響返回值.
sophy
2013-07-28 01:57:03 +08:00
能通就是1反之就是0
sdzbzyc
2013-07-28 10:03:10 +08:00
@013231
感谢回复
是不是可以这样理解,ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null 是0还是1取决于能不能ping通,而与&> /dell/null重定向没有关系。
sdzbzyc
2013-07-28 10:05:41 +08:00
@sophy 嗯 有点懂了
xdays
2013-07-28 10:32:18 +08:00
动手验证下呗
echo -e "aa\nbb" > /tmp/foo.txt; grep cc /tmp/foo.txt >/dev/null && echo 0 || echo 1; grep aa /tmp/foo.txt>/dev/null && echo 0 || echo 1
013231
2013-07-28 10:36:15 +08:00
@sdzbzyc 是的. `echo $?`可以看到上一個命令的返回值, 你試試就知道了.
axios@gentoo ~ $ ping notExist
ping: unknown host notExist
axios@gentoo ~ $ echo $?
2
axios@gentoo ~ $ ping notExist &> /dev/null
axios@gentoo ~ $ echo $?
2
由此可見, 雖然第二次ping通過重定向把錯誤信息影藏起來了, 但並不影像返回值.
013231
2013-07-28 10:42:34 +08:00
s/影像/影響/
LazyZhu
2013-07-28 11:06:28 +08:00
@sdzbzyc @sophy 反了
能通是0反之是1

这里涉及到了了Shell命令的逻辑符的优先级及作用
&& 逻辑与,遇false退出
|| 逻辑或,遇true退出
013231
2013-07-28 11:37:11 +08:00
@LazyZhu 這裏還要再補充一下, 對於絕大部分編程語言, 0為假, 非零為真; 但對於bash正好相反, 0(執行成功)為真, 非零(執行失敗)為假.
darasion
2013-07-28 11:59:34 +08:00
命令或程序的返回值,是程序运行完毕或退出时放在寄存器里返回给内核的状态,跟重定向没关系,也没办法重定向。shell做布尔判断的就是这个东西。

能重定向的是:标准输入,标注输出,标准错误,它们都是文件描述符,是进程打开的文件(屏幕中断也是设备文件)的代号。

大概是这个意思吧。
darasion
2013-07-28 12:00:59 +08:00
@darasion 中断->终端
sdzbzyc
2013-07-28 22:27:27 +08:00
@013231
@xdays
@LazyZhu
@darasion
谢谢各位,受教了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77180

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX