V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SoloCompany
V2EX  ›  Bash

macOS 的 bash 的 source 命令一个比较奇怪的现象

  •  
  •   SoloCompany · 2017-03-26 01:11:11 +08:00 · 2464 次点击
    这是一个创建于 2804 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题起源于 man npm-completion 的时候,尝试了一下这个命令 source <(npm completion) 发现不生效,有点抓狂,十分奇怪就去摸索了下

    以下是验证过程

    1. 最初的预期:输出 123

      source <(echo echo 123)
      

      在 macOS 下失败了,没有输出,而在 linux 下按预期输出了 123

    2. source 换成🐱验证一下是否管道文件有问题

      cat <(echo echo 123)
      

      这次无论是 macOS 还是 linux 都按预期输出了 echo 123, 说明管道文件的读取是没问题的

    3. 把管道的位置交换一下,让 source 去读取 stdin 这次居然很意外的成功了

      echo echo 123 | source /dev/stdin
      

      成功输出了 123, 但是这次虽然成功但因为在管道的后面 source 其实是在一个 subshell 里面执行的无法改变当前 shell 的环境所以其实毫无意义

      只是这个测试结果让我非常困惑,为什么 source 命令有时候能读取管道文件( 1 )有时候有不行呢( 3 )

    4. 把管道的顺序反过来试试(其实和 1 是完全一样的,不管了,死马当活马医)

      source /dev/stdin < <(echo echo 123)
      

      果不其然,结果和 1 一样, macOS 失败而 linux 成功

    5. 最后没辙了,用 eval 吧,没有管道了总不可能还失败吧

      eval "$(echo echo 123)"
      

      结果当然是没问题,成功输出了 123

    6. 回到最初的问题,当然用 eval 就可以解决了

      eval "$(npm completion)"
      

    真是让人困惑, macOS 的 bash 到底有什么不同导致有这样的行为差异

    本来想去 SO 问的,但打英文太累了,还是在这里吐槽一下算了

    1 条回复    2020-12-14 23:33:43 +08:00
    heyjei
        1
    heyjei  
       2020-12-14 23:33:43 +08:00 via Android
    < 这个符号用的不多,不熟悉。
    不过你确定是用的 mac os 的 bash 嘛? macos 默认的是 zsh 。
    如果是 bash,那会不会是两边的 bash 的版本问题?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.