在 'docker exec' 命令中执行 'bash -c'
Executing 'bash -c' in 'docker exec' command
上下文: 我正在尝试为日常使用 docker exec
命令编写一个快捷方式。出于某些原因,我正在试验当我在容器内使用 bash 控制台时我的输出有时会被破坏的问题(历史搞砸了,在我写的时候行互相覆盖,...)
我读到 您可以通过在启动 bash 控制台之前添加一些命令来解决这个问题。
这是我的脚本所做的相关摘录
#!/bin/bash
containerHash=
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
我读到 这与解析和扩展有关。但是,我无法使用函数或 eval
命令(或者至少我没有成功使其工作)。
如果我直接在我的终端中执行第一行输出,它可以正常工作。
我该如何克服这个问题?
与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
修复
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=
bar=
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
只使用双引号,所以变量被解释
- 因为我们使用
eval $final_cmd
命令很好解释,bash很高兴。
最后,一个用法示例:
bash /tmp/dockerize.sh 5b02ab015730 world
给予
running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world
上下文: 我正在尝试为日常使用 docker exec
命令编写一个快捷方式。出于某些原因,我正在试验当我在容器内使用 bash 控制台时我的输出有时会被破坏的问题(历史搞砸了,在我写的时候行互相覆盖,...)
我读到
这是我的脚本所做的相关摘录
#!/bin/bash
containerHash=
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
我读到 eval
命令(或者至少我没有成功使其工作)。
如果我直接在我的终端中执行第一行输出,它可以正常工作。
我该如何克服这个问题?
与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
修复
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=
bar=
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
只使用双引号,所以变量被解释 - 因为我们使用
eval $final_cmd
命令很好解释,bash很高兴。
最后,一个用法示例:
bash /tmp/dockerize.sh 5b02ab015730 world
给予
running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world