gpt4 book ai didi

linux - Bash、变量和转义符号

转载 作者:太空宇宙 更新时间:2023-11-04 04:47:35 25 4
gpt4 key购买 nike

我有一个脚本,通过 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 documentation建议在脚本中使用 --porcelain 而不是 --short (-s)。
  • 要获取当前分支的名称,请使用 git symbolic-ref -q --short HEAD (这比使用 gitbranch 并提取 *-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\)'

这里仍然有一个错误:注意 && 与分号的绑定(bind)。如果 /var/www 不存在,则 mc 未设置,并继续尝试设置 branch。 (这不是一个非常严重的错误,但仍然不太正确。)

关于linux - Bash、变量和转义符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com