![](/img/trans.png)
[英]Pipe output from command in Git Bash to Powershell script on windows
[英]pipe is returning empty string in bash in git for windows
一些評論指的是這個問題背后的完整“故事”,但我決定縮短它,因為它太長而且難以遵循。 我盡可能地向你展示簡潔的失敗例子。 對於那些有興趣了解問題的完整背景的人:可以在問題的先前修訂版中找到它 。
這個: basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
是安裝任何軟件包后由npm 生成的腳本中的第一行(不包括hashbang)行使用CLI。 由於某種原因, 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)出了問題,而且我個人認為它可能來自於它的想法。 我的發現:
片段:
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
總結評論,簡短(tl; dr)版本:降級,升級和/或重新安裝Git for Windows附帶的MSYS和MinGW。
MSYS補充MinGW , Git for Windows提供的版本可以從MSYS的原始維護者修改。 有一個針對MSYS報告的錯誤似乎是同樣的問題(使用“mingw版本:64位捆綁了git版本2.8.3.windows.1”),但被標記為“適合我”(即,“無法重現“)。 但有一條評論認為問題可能出在重新包裝上:
“請注意,與Windows的git捆綁在一起的MSYS可能會從我們的官方發行版中修改,(64位MinGW肯定不是我們的);因此我們不會正式支持其中任何一個。” https://sourceforge.net/p/mingw/bugs/2303/
長話短說,看起來像一個bug。
basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
這似乎是XY問題的一個例子。 讓我們分解這一行:
echo "$0"
這通常是腳本的路徑,例如./alfa.sh
sed -e 's,\\\\,/,g'
這將使用正斜杠替換反斜杠。 這就是這條線開始分崩離析的地方:
你不需要-e
,你可以做sed 's,\\\\,/,g'
你可能不需要g
,通常只是一個斜杠,如上所示
改變斜線並不是真的有意義。 即使在Windows上,Bash也將使用正斜杠
如果由於某種原因需要更改斜杠,那么Sed就不是正確的工具,cygpath是:
$ cygpath -m 'C:\\Program Files\\Mozilla Firefox\\firefox.exe' C:/Program Files/Mozilla Firefox/firefox.exe
dirname
現在你在sed / cygpath之后調用dirname。 之前應該調用它,這樣sed / cygpath就不必更換了:
basedir=$(cygpath -m "$(dirname "$0")")
最后,sed命令是另一個原因; 如果你要吐出一條路,它應該是絕對的,因為為什么不呢?
basedir=$(cygpath -am "$(dirname "$0")")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.