问题起源于 man npm-completion
的时候,尝试了一下这个命令 source <(npm completion)
发现不生效,有点抓狂,十分奇怪就去摸索了下
以下是验证过程
最初的预期:输出 123
source <(echo echo 123)
在 macOS 下失败了,没有输出,而在 linux 下按预期输出了 123
把 source
换成🐱验证一下是否管道文件有问题
cat <(echo echo 123)
这次无论是 macOS 还是 linux 都按预期输出了 echo 123
,
说明管道文件的读取是没问题的
把管道的位置交换一下,让 source
去读取 stdin
这次居然很意外的成功了
echo echo 123 | source /dev/stdin
成功输出了 123
,
但是这次虽然成功但因为在管道的后面 source
其实是在一个 subshell
里面执行的无法改变当前 shell 的环境所以其实毫无意义
只是这个测试结果让我非常困惑,为什么 source 命令有时候能读取管道文件( 1 )有时候有不行呢( 3 )
把管道的顺序反过来试试(其实和 1 是完全一样的,不管了,死马当活马医)
source /dev/stdin < <(echo echo 123)
果不其然,结果和 1 一样, macOS 失败而 linux 成功
最后没辙了,用 eval
吧,没有管道了总不可能还失败吧
eval "$(echo echo 123)"
结果当然是没问题,成功输出了 123
回到最初的问题,当然用 eval
就可以解决了
eval "$(npm completion)"
真是让人困惑, macOS 的 bash 到底有什么不同导致有这样的行为差异
本来想去 SO 问的,但打英文太累了,还是在这里吐槽一下算了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.