簡體   English   中英

重擊,變量和轉義符號

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

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