V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
sdzbzyc
V2EX  ›  Linux

关于shell的问题

  •  
  •   sdzbzyc · 2013-07-28 00:02:52 +08:00 · 3387 次点击
    这是一个创建于 3917 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null && result=0 || result=1

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

    无论能不能ping通,都可以成功输出到空设备,那只有执行后面的0了,搞不明白
    12 条回复    1970-01-01 08:00:00 +08:00
    013231
        1
    013231  
       2013-07-28 01:50:00 +08:00   ❤️ 1
    你的理解是錯誤的. 重定向只是決定輸出到什麼地方, 並不會把失敗的命令變成成功的. 在這個例子中, 重定向不影響返回值.
    sophy
        2
    sophy  
       2013-07-28 01:57:03 +08:00 via iPad   ❤️ 1
    能通就是1反之就是0
    sdzbzyc
        3
    sdzbzyc  
    OP
       2013-07-28 10:03:10 +08:00
    @013231
    感谢回复
    是不是可以这样理解,ping -c 1 -w 1 ${network}.${sitenu} &> /dell/null 是0还是1取决于能不能ping通,而与&> /dell/null重定向没有关系。
    sdzbzyc
        4
    sdzbzyc  
    OP
       2013-07-28 10:05:41 +08:00
    @sophy 嗯 有点懂了
    xdays
        5
    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
        6
    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
        7
    013231  
       2013-07-28 10:42:34 +08:00
    s/影像/影響/
    LazyZhu
        8
    LazyZhu  
       2013-07-28 11:06:28 +08:00   ❤️ 1
    @sdzbzyc @sophy 反了
    能通是0反之是1

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

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

    大概是这个意思吧。
    darasion
        11
    darasion  
       2013-07-28 12:00:59 +08:00
    @darasion 中断->终端
    sdzbzyc
        12
    sdzbzyc  
    OP
       2013-07-28 22:27:27 +08:00
    @013231
    @xdays
    @LazyZhu
    @darasion
    谢谢各位,受教了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2868 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 15:20 · PVG 23:20 · LAX 08:20 · JFK 11:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.