无法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"
,如果实际上它引用了语义,那么显然这个撇号是有问题的)。