簡體   English   中英

管道在git中為bash返回空字符串

[英]pipe is returning empty string in bash in git for windows

編輯:更新到Git for Windows> = 2.9.0.windows1后,問題已解決


放棄

一些評論指的是這個問題背后的完整“故事”,但我決定縮短它,因為它太長而且難以遵循。 我盡可能地向你展示簡潔的失敗例子。 對於那些有興趣了解問題的完整背景的人:可以在問題的先前修訂版中找到它


這個: 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)出了問題,而且我個人認為它可能來自於它的想法。 我的發現:

  • 將Git for Windows降級到2.6.4解決了這個問題。 我仍然不喜歡被困在舊版本上; /
  • 它在干凈的Windows 10 VM上運行良好
  • 管道輸出似乎是完全空的,因為運行以下代碼段不會返回任何結果。
  • 關於mingw + msys問題的干凈安裝不會發生

片段:

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補充MinGWGit 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' 

這將使用正斜杠替換反斜杠。 這就是這條線開始分崩離析的地方:

  1. 你不需要-e ,你可以做sed 's,\\\\,/,g'

  2. 你可能不需要g ,通常只是一個斜杠,如上所示

  3. 改變斜線並不是真的有意義。 即使在Windows上,Bash也將使用正斜杠

  4. 如果由於某種原因需要更改斜杠,那么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")")

現在請注意,甚至沒有涉及管道。 我還要補充一點,這個問題最近引入 NPM回購。 你可以評論那里的開發者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM