【发布时间】:2016-10-05 05:34:31
【问题描述】:
编辑:更新到 Git for Windows >= 2.9.0.windows1 后问题已解决
免责声明
一些 cmets 指的是这个问题背后的完整“故事”,但我决定缩短它,因为它变得太长且难以理解。我向您展示尽可能简洁的失败示例。对于那些有兴趣了解问题的完整背景的人:可以在previous revision of the question 获得。
This:basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 是安装 CLI 附带的任何软件包后由 npm 生成脚本中的第一行(不包括 hashbang)。
出于某种原因,basedir 解析不正确,这就是节点找不到模块并崩溃的原因。我设法将问题缩小到最新 Git for Windows 的 git-bash 上的子外壳中的管道。执行:
echo -n "1:"
echo "a" | cat
echo -n "2:"
echo "$(echo "a" | cat)"
echo -n "3:"
echo "$(echo "a")"
打印:
1:a
2:
3:a
我找不到其他人遇到这个问题,所以我认为这是我的环境(Windows 10 Pro,Git for Windows 2.8.4)有问题,我个人不知道它可能来自哪里。 我的发现:
- 将适用于 Windows 的 Git 降级到 2.6.4 可以解决此问题。我仍然不喜欢被困在旧版本上;/
- 它在干净的 Windows 10 虚拟机上运行良好
- 管道输出似乎完全为空,因为在 sn-p 之后运行不会返回任何结果。
- 在全新安装 mingw + msys 时不会出现问题
sn-p:
echo $(echo foobar | cat > bazzzzzzzzzz ; ) ; cat bazzzzzzzzzz
find /c -name bazzzzzzz* 2> /dev/null # /c, /d and /x are my Windows partitions
find /d -name bazzzzzzz* 2> /dev/null # I did test if it actually works for existing file and it does
find /x -name bazzzzzzz* 2> /dev/null
感谢 agc 为解决这一问题提供的宝贵帮助。
我的PATH 变量如下所示:
PATH=/c/Users/ja/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/ja/bin:/c/Windows:/c/Windows/System32:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/Program Files/nodejs:/c/ProgramData/Oracle/Java/javapath:/c/program files/graphicsmagick-1.3.23-q16:/c/ProgramData/chocolatey/lib/getopt/binaries:/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit:/c/Program Files/nodejs:/c/Program Files (x86)/Microsoft VS Code/bin:/c/Users/ja/AppData/Roaming/npm:/c/Program Files (x86)/MacType:/usr/bin/vendor_perl:/usr/bin/core_perl
还有
$ which sed
/usr/bin/sed
$ which echo
/usr/bin/echo
$ which cat
/usr/bin/cat
$ echo $SHELL
/usr/bin/bash
【问题讨论】:
-
在这种情况下确实不需要它,但正如我所说,这个脚本是在通过 npm 安装节点包的过程中自动生成的,所以每次安装后手动修改这些脚本几乎会破坏使用包管理器的想法。我还从问题的潜在来源中排除了 npm,因为我在互联网上找不到任何人在为此类问题苦苦挣扎。感谢您的评论:)
-
它的行为好像不是调用普通的
sed,而是调用sed -n,即,一个不打印任何内容的 sed 版本,除非明确告诉打印某些东西(或者只是一个完全损坏的命令,总是什么都不打印)。 -
尝试将
echo "$0" | sed -e 's,\\,/,g'换成echo "$0" | tr '\\' '/'。 -
两个错误都有
$( foo | bar )之类的东西,所以下一步是看看你是否可以简化它。$( foo )单独工作吗?如果是这样,可能是管道,所以试试$( foo | cat )。 -
好的,所以我们知道 pipe 的工作,简单的 命令替换 工作,但是 命令替换 与pipe 失败——或者可能将输出发送到 STDOUT 以外的某个地方。要测试,请尝试
echo $(echo foobar | cat > baz ; ) ; cat baz
标签: windows git bash shell pipe