簡體   English   中英

Bash 帶空格的變量

[英]Bash variables with spaces

我在 windows 下的 MinGW shell 中面臨下一個問題。我的/etc/profile中有以下表達式:

export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"

當我在本地存儲庫上使用git fetch時,這不起作用。 但是如果我這樣做(舊的 DOS 方式),它會起作用:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"

我的問題是:

如何使用變量中的空格使其工作?

出於測試目的,您可以模擬這樣的事情(任何例子都很好):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR

是否有解決方案(除了前面提到的)?

像這樣執行它: "$VAR" 這是 shell 腳本中最重要的問題之一,因為字符串總是按字面意思替換,並且任何包含的空格都被視為標記分隔符而不是字符串的字符。 將變量替換為運行時粘貼的一種代碼。

當您編寫$VAR時真正發生的是 shell 嘗試使用第一個參數Files/TortoiseGit/bin/TortoisePlink.exe執行二進制/c/Program

通過在特定輸入的大型 shell 腳本中遇到奇怪的語法錯誤,我很難學到這一點。 如果運行時輸入包含特殊字符,我能想到的任何其他語言都不會抱怨語法錯誤 - 但這是 shell 腳本的本質,因為像 bash 和 sh 這樣的命令解釋器逐行解釋代碼。

每當您希望字符串包含空格並且不想將其視為單獨的標記時,請將其括在雙引號中。

作為參考,我通過用轉義引號封裝參數解決了 osx 上的類似問題。 這可能不是最好的解決方案,但它似乎有效。

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""

我已經通過包含反斜杠來逃避空格來解決它:

/Program Files變為/Program\ Files

例子:

export GIT_SSH=/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe

使用GIT_SSH 2.23(2019 年第三季度,八年后),設置為/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe的 GIT_SSH 將...工作(對於仍在 Windows 7 上的用戶)!

請參閱Johannes Schindelin ( dscho )提交 eb7c786 (2019 年 7 月 16 日)。
(由Junio C Hamano -- gitster --提交 a5194d8中合並,2019 年 7 月 25 日)

mingw :支持生成名稱中包含空格的程序

在一些較舊的 Windows 版本(例如 Windows 7)上, CreateProcessW() function 在其第一個參數lpApplicationName中並不真正支持空格。
但它支持將NULL作為lpApplicationName傳遞,這使得它可以從lpCommandLine的(可能引用的)第一個參數中找出應用程序。

讓我們使用這個技巧(如果我們確定第一個參數與可執行文件的路徑匹配)來支持啟動路徑包含空格的程序。

這修復git-for-windows/git問題 692


Git 2.24 (Q4 2019) 增加測試:

請參閱Alexandr Miloslavskiy ( SyntevoAlex )提交 71f4960 (2019 年 10 月 1 日)。
(由Junio C Hamano -- gitster --提交 424663d中合並,2019 年 10 月 9 日)

t0061 : 修復帶有空格的argv[0]測試(僅限 MINGW)

該測試最初是針對以下情況設計的:用戶報告在GIT_SSH設置為路徑中有空格的.bat文件失敗: git-for-windows#692

變量中帶有空格的命令的一些骯臟的技巧-

for i in `k get po --all-namespaces -o wide | grep 'CrashLoop\|ImagePull' | awk '{printf " -n@%s@scale@deployment/%s",$1,$2}'`; do $(echo "kubectl ${i%-*-*} --replicas=0" | sed 's/@/ /g'); done

所以在這里我使用 @ 而不是空格形成變量並使用 $(echo variavle | sed 's/@/ /g') 執行 sed 中帶有空格的行

它是 hackk 但它比所有“正確的方法”都簡單並且對我有用

暫無
暫無

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

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