技术解析

关于shell的问题
0
2021-07-21 10:31:33
idczone
ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null && result=0 || result=1

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

无论能不能ping通,都可以成功输出到空设备,那只有执行后面的0了,搞不明白
你的理解是錯誤的. 重定向只是決定輸出到什麼地方, 並不會把失敗的命令變成成功的. 在這個例子中, 重定向不影響返回值.

能通就是1反之就是0


感谢回复
是不是可以这样理解,ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null 是0还是1取决于能不能ping通,而与&> /dell/null重定向没有关系。

嗯 有点懂了

动手验证下呗
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

是的. `echo $?`可以看到上一個命令的返回值, 你試試就知道了.
[email&~ $ ping notExist
ping: unknown host notExist
[email&~ $ echo $?
2
[email&~ $ ping notExist &> /dev/null
[email&~ $ echo $?
2
由此可見, 雖然第二次ping通過重定向把錯誤信息影藏起來了, 但並不影像返回值.

s/影像/影響/

反了
能通是0反之是1
这里涉及到了了Shell命令的逻辑符的优先级及作用
&& 逻辑与,遇false退出
|| 逻辑或,遇true退出

這裏還要再補充一下, 對於絕大部分編程語言, 0為假, 非零為真; 但對於bash正好相反, 0(執行成功)為真, 非零(執行失敗)為假.

命令或程序的返回值,是程序运行完毕或退出时放在寄存器里返回给内核的状态,跟重定向没关系,也没办法重定向。shell做布尔判断的就是这个东西。
能重定向的是:标准输入,标注输出,标准错误,它们都是文件描述符,是进程打开的文件(屏幕中断也是设备文件)的代号。
大概是这个意思吧。

中断->终端





谢谢各位,受教了

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服