无法find我的脚本中的错误不符合预期的行为

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代码是未完成的,下一行是运行。 请帮助我如何才能将文件读入variables后才写入? 为什么这种模棱两可的行为呢?

这部分你有多个错误:

 `$(cat B)` 

你正在混合两个命令replace。 $(cat B)`cat B`代名词,所以你在这里实际上相当于$($(cat B)) 。 换句话说,把B的内容作为命令使用,然后replace命令的输出。

而且,因为你在命令周围使用了双引号,所以这个结构是在命令被parsing时被评估的,而不是被执行的。 您可以通过反斜杠转义美元符号来防止这种情况。

此外,为了防止shell在计算string时插入它,就像命令replace一样,您需要转义${CHECK_VALUE} 。 我也build议引用价值,除非你期望它包含一个单一的标记(甚至可能是为了你自己的理智)。

最后,你有一个悬而未决的&&没有任何事情之后。 这是一个语法错误。

这是你的脚本与我的修复:

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

在输出包含shell元字符的情况下,我还在cat添加了引号。

…虽然捕获一个variables,所以你可以echo它是一个反模式 ; 可能你只是想把cat ${B}作为最后的命令。

如果您希望su - hello导致后续命令以hello方式运行,那也是错误的(尽pipe这是一个常见的新手错误)。 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" 

单引号不能防止variables插值,因为在双引号内部,它们实际上并没有引用任何东西(比较echo "don't" ,如果实际上它引用了语义,那么显然这个撇号是有问题的)。