[英]Bash, variables and escaping symbols
我有一個腳本,該腳本通過SSH連接到測試服務器並檢索當前的Git分支。 當我嘗試使用變量來打印分支和已修改文件數量的計數時,我會使用轉義符號進行堆疊。
以下內容適用於本地文件夾:
mc=$(git status -s | grep -E '^[^?]+' -c);
branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/');
echo $branch \($mc\)
但這不起作用:
ssh -i ~/.ssh/id_rsa.cron local.stage "cd /var/www && mc=$(git status -s | grep -E '^[^?]+' -c);
branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/');
echo $branch \($mc\)"
雙引號內的內容具有變量擴展和命令替換功能。 因此,例如:
ssh remotehost "echo $(pwd)"
將使其他主機回顯pwd
在本地主機上產生的內容。 (即, $(pwd)
首先在此處運行,然后將類似echo /home/user/current/dir
內容發送到遠程主機,該主機將忠實地回顯現在不變的字符串。)
您需要防止命令替換(以任何合適的方式,例如,使用單引號):
ssh remotehost 'echo $(pwd)'
它將原義字符串echo $(pwd)
傳遞到遠程主機(在該主機上,無論您在該主機上使用任何shell都將對其起作用)。
除此之外,您還可以對命令序列進行一些小的改進:
git status
文檔建議在腳本中使用--porcelain
而不是--short
( -s
)。 git symbolic-ref -q --short HEAD
(這比使用git branch
並提取*
-ed行並進行修改要簡單得多)。 將它們放在一起並將內部引號轉換為雙引號(這是可以的,因為那里不會發生替換):
ssh -i ~/.ssh/id_rsa.cron local.stage 'cd /var/www &&
mc=$(git status --porcelain | grep -E "^[^?]+" -c);
branch=$(git symbolic-ref -q --short HEAD);
echo $branch \($mc\)'
這里仍然存在一個錯誤:請注意&&
與分號之間的綁定。 如果/var/www
不存在,則會使mc
設置狀態,並繼續嘗試設置branch
。 (這不是一個非常重要的錯誤,但是仍然不是很正確。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.