gpt4 book ai didi

bash - 在双引号下重定向包含 git 命令的字符串失败

转载 作者:太空狗 更新时间:2023-10-29 14:27:42 24 4
gpt4 key购买 nike

我正在从自动安装的 bash 创建一个 bash 脚本文件。

那个文件应该只 cd 到一个 git 目录,寻找一个新版本,如果有一个最新的更改和重建。

脚本本身可以运行并且文件已创建,但在创建时它向我显示 fatal: not a git repository (or any of the parent directories): .git twice.

create_file.sh

echo "HOME=/home/nknx" > nknupdate
echo "GOPATH=/home/nknx/go" >> nknupdate
echo "PATH=/usr/local/go/bin:$PATH:$GOPATH/bin" >> nknupdate
echo "cd /home/nknx/go/src/github.com/nknorg/nkn" >> nknupdate
echo "git fetch &>/dev/null" >> nknupdate
echo "LOCAL=$(git rev-parse HEAD)" >> nknupdate
echo "UPSTREAM=$(git rev-parse @{u})" >> nknupdate
echo "if [ $LOCAL != $UPSTREAM ]" >> nknupdate
echo "then" >> nknupdate
echo "systemctl stop nkn.service;" >> nknupdate
echo "git merge;" >> nknupdate
echo "make deepclean;" >> nknupdate
echo "make;" >> nknupdate
echo "chown -R nknx:nknx /home/nknx/go;" >> nknupdate
echo "systemctl restart nkn.service;" >> nknupdate
echo "fi" >> nknupdate

我用 bash -x create_file.sh 运行脚本:

 + echo HOME=/home/nknx
+ echo GOPATH=/home/nknx/go
+ echo PATH=/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/bin
+ echo 'cd /home/nknx/go/src/github.com/nknorg/nkn'
+ echo 'git fetch &>/dev/null'
++ git rev-parse HEAD
fatal: not a git repository (or any of the parent directories): .git
+ echo LOCAL=
++ git rev-parse '@{u}'
fatal: not a git repository (or any of the parent directories): .git
+ echo UPSTREAM=
+ echo 'if [ != ]'
+ echo then
+ echo 'systemctl stop nkn.service;'
+ echo 'git merge;'
+ echo 'make deepclean;'
+ echo 'make;'
+ echo 'chown -R nknx:nknx /home/nknx/go;'
+ echo 'systemctl restart nkn.service;'
+ echo fi

为什么我刚刚创建文件时会抛出这个错误?我怎样才能摆脱它?

最佳答案

正如另一个答案中正确指出的那样,在 Debug模式下运行应该可以帮助您识别问题。

问题是在将以下命令写入文件时,命令替换 $(..)".." 中扩展。 shell 已在当前路径中运行命令,而不是将命令附加到文件 nknupdate

echo "LOCAL=$(git rev-parse HEAD)" >> nknupdate
echo "UPSTREAM=$(git rev-parse @{u})" >> nknupdate

shell 首先尝试扩展需要扩展命令替换的引号,即运行 git 命令。由于脚本运行的路径不包含 .git 目录,因此上述命令呈现失败。

解决这个问题的方法是推迟扩展命令替换,通过将其转义或将其放在引号内。任何一种方法都应该没问题。

echo 'PATH=/usr/local/go/bin:$PATH:$GOPATH/bin' >> nknupdate
echo 'LOCAL=$(git rev-parse HEAD)' >> nknupdate
echo 'UPSTREAM=$(git rev-parse @{u})' >> nknupdate
echo 'if [ $LOCAL != $UPSTREAM ]' >> nknupdate

因此,任何包含 $ 扩展的行,无论是变量扩展 ($var) 还是命令替换 $(..) 应该进行转义,以便将命令正确写入文件。

关于bash - 在双引号下重定向包含 git 命令的字符串失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57179629/

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