在'docker exec'命令中执行'bash -c'

Adr*_*enW 5 bash docker docker-exec

上下文:我正在尝试为日常使用该docker exec命令编写一个快捷方式。由于某些原因,我正在尝试一个问题,当我在容器内使用bash控制台时,有时输出会中断(历史被弄乱了,在我写的时候,行彼此覆盖,...)

在这里读到,您可以通过在启动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
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

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
Run Code Online (Sandbox Code Playgroud)

在这里读到,这与解析和扩展有关。但是,我不能使用函数或eval命令(或者至少我没有成功使它起作用)。

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

我该如何克服这个问题?

Aro*_*unt 6

它与Docker不相关,但是与Bash有关(换句话说,该命令的docker部分工作良好,它只是在容器上进行bash抱怨,就像它在您的主机上发牢骚一样):

最小的可再现误差

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
Run Code Online (Sandbox Code Playgroud)

固定

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

hello
Run Code Online (Sandbox Code Playgroud)

回答

foo='docker exec -it XXX bash -c "echo hello"'
eval $foo
Run Code Online (Sandbox Code Playgroud)

这将使您可以echo hello在容器上执行命令,现在,如果您想向此命令添加动态变量(例如echo $string),则只需去除双引号的单引号,要使其有效,您就必须转义内部双引号:

foo="docker exec -it $container bash -c \"echo $variable\""
Run Code Online (Sandbox Code Playgroud)

一个完整的例子

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
Run Code Online (Sandbox Code Playgroud)

让我们花些时间深入研究,

  • $FOO 是一个静态变量,在我们的例子中,它的作用与常规变量完全相同,只是为了向您展示。
  • $bar 是一个动态变量,它将第二个命令行参数作为值
  • 因为$cmd$final_cmd仅使用双引号,所以变量被解释
  • 因为我们对eval $final_cmd命令的使用得到了很好的解释,所以bash很高兴。

最后是一个用法示例:

bash /tmp/dockerize.sh 5b02ab015730 world
Run Code Online (Sandbox Code Playgroud)

running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world
Run Code Online (Sandbox Code Playgroud)