gpt4 book ai didi

bash - 无法在我的脚本中发现错误,其行为与预期不符

转载 作者:行者123 更新时间:2023-12-02 18:47:03 24 4
gpt4 key购买 nike

docker run --rm \
/bin/bash -c "\
su - hello && \
echo \"Pre\" && \
python ${M} ${F} ${D} ${B} && \
echo \"Post\" && \
CHECK_VALUE=`$(cat B)` && \
echo ${CHECK_VALUE} && \
"

我的问题是$ {B}是由python代码生成的文件。
但是,每当我运行此命令时,我都会得到以下日志:
cat: /home/hello/D/W/H/b.txt: No such file or directory
Pre
Post

而且在空行
这显然意味着我的python代码未完成,下一行运行。
请帮助我如何仅在写入文件后将其读入变量?
为什么会有这种模棱两可的行为?

最佳答案

您在此部分中有多个错误:

`$(cat B)`

您正在混合两个命令替换。 $(cat B)`cat B`的同义词,因此您在这里实际上等于 $($(cat B))。换句话说,取B的内容并将其用作命令,然后替换该命令的输出。

此外,由于您在命令周围使用双引号,因此在分析命令时(而不是在执行命令时)会评估此构造。您可以通过反斜杠对美元符号进行转义来防止这种情况。

另外,您需要转义 ${CHECK_VALUE},以防止 shell 程序在评估字符串时对其进行插值,就像命令替换一样。我还建议您引用该值,除非您期望它包含一个 token (甚至可能只是出于您自己的理智)。

最后,您有一个悬挂的 &&,后面没有任何内容。这是语法错误。

这是包含我的修复程序的脚本:
docker run --rm \
/bin/bash -c "\
su - hello && \
echo \"Pre\" && \
python ${M} ${F} ${D} ${B} && \
echo \"Post\" && \
CHECK_VALUE=\"\$(cat B)\" && \
echo \"\${CHECK_VALUE}\""

我还在 cat周围添加了引号,以防其输出包含shell元字符。

...尽管捕获变量只是为了 echo它是 antipattern;可能您只是想将 cat ${B}作为最终命令。

如果您期望 su - hello导致后续命令以 hello的身份运行,那也是错误的(尽管这是一个常见的新手错误)。 su产生一个新的 shell 程序,当该 shell 程序终止(不在其内部)时,将执行以下命令。您可能会说 su -c "python $M $F $D $B" hello && cat "$B"简单明了。将其包装在 docker命令行中,尝试
docker run --rm \
/bin/bash -c "su -c 'python $M $F $D $B' hello && cat $B"

单引号不会阻止变量插值的地方,因为双引号内部实际上并没有引号(比较 echo "don't",如果实际上引号是引号,则单引号显然是有问题的)。

关于bash - 无法在我的脚本中发现错误,其行为与预期不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154439/

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