Bash docker exec在以$()包装命令时给出不同的PID

Bash docker exec在以$()包装命令时给出不同的PID,bash,docker,Bash,Docker,发生了以下情况: $ docker exec my_container /bin/bash -l -c "pgrep -f 'java'" 7 $ docker exec my_container /bin/bash -l -c "echo $(pgrep -f 'java')" 11792 这些PID分别位于容器内部和容器外部 我不明白为什么会这样。com一个简单的$()如何逃逸docker exec上下文 我做错了什么?Bash有优先权。在将信息传递给docker exec之前,它会在子s

发生了以下情况:

$ docker exec my_container /bin/bash -l -c "pgrep -f 'java'"
7
$ docker exec my_container /bin/bash -l -c "echo $(pgrep -f 'java')"
11792
这些PID分别位于容器内部和容器外部

我不明白为什么会这样。com一个简单的$()如何逃逸docker exec上下文


我做错了什么?

Bash有优先权。在将信息传递给docker exec之前,它会在子shell中展开变量和命令。这相当于运行
docker exec my_container/bin/bash-l-c“echo 11792”
(尝试将
echo
放在两个命令的前面,看看shell是如何扩展它们的。)我建议使用
echo
,而不是
set-x
(作为单独的命令)在运行这些命令之前,请查看它们正在做什么(以及
设置+x
之后,请将其关闭)<代码>回音在完全解析后打印内容(包括引号和转义删除),这可能会产生误导。(OTOH,
-x
模式在命令执行时以等效的引号/转义打印命令,这可能会造成不同程度的混淆。叹气。)