执行' bash -c' in' docker exec'命令

时间:2018-05-07 12:37:42

标签: bash docker docker-exec

上下文:我试图为我每天使用docker exec命令编写一个快捷方式。出于某些原因,我正在试验一个问题,即当我在容器内使用bash控制台时,我的输出有时会被破坏(历史记录混乱,线条在我写作时相互覆盖,... 。)

我阅读here您可以通过在启动bash控制台之前添加一些命令来解决此问题。

以下是我的脚本所做的相关摘录

#!/bin/bash
containerHash=$1
commandToRun='bash -c "stty cols $COLUMNS rows $LINES && bash -l"'

finalCommand="winpty docker exec -it $containerHash $commandToRun"
echo $finalCommand
$finalCommand

以下是我得到的输出:

winpty docker exec -it 0b63a bash -c "stty cols $COLUMNS rows $LINES && bash -l"
cols: -c: line 0: unexpected EOF while looking for matching `"'
cols: -c: line 1: syntax error: unexpected end of file

我读here这与解析和扩展有关。但是,我无法使用函数或eval命令(或者至少我没有成功使其工作)。

如果我直接在终端中执行第一条输出线,它可以正常工作。

我该如何克服这个问题?

1 个答案:

答案 0 :(得分:3)

这不是与Docker相关的,而是Bash(换句话说,Docker的命令部分效果很好,它只是在容器上抱怨,就像它会在你的主机上抱怨):

最小可重现错误

'WM577vZ'

修复

cmd='bash -c "echo hello"'
$cmd

hello": -c: line 0: unexpected EOF while looking for matching `"'
hello": -c: line 1: syntax error: unexpected end of file

答案

cmd='bash -c "echo hello"'
eval $cmd

hello

这将允许您在容器上执行命令foo='docker exec -it XXX bash -c "echo hello"' eval $foo ,现在如果要向此命令添加动态变量(如echo hello),您只需要删除双引号的单引号,为了使这个工作,你将不得不逃避内部双引号:

echo $string

一个完整的例子

foo="docker exec -it $container bash -c \"echo $variable\""

让我们花点时间挖掘,

  • FOO="Hello" container=$1 bar=$2 cmd="bash -c \"echo $FOO, $bar\"" final_cmd="docker exec -it $container $cmd" echo "running command: \"$final_cmd\"" eval $final_cmd 是一个静态变量,在我们的例子中,它的作用与常规变量完全相同,只是为了向您展示。
  • $FOO是一个动态变量,它将第二个命令行参数作为值
  • 由于$bar$cmd仅使用双引号,因此解释变量
  • 因为我们使用$final_cmd命令得到了很好的解释,所以bash很高兴。

最后,一个用法示例:

eval $final_cmd

给出

bash /tmp/dockerize.sh 5b02ab015730 world