[英]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 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.