gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:04:27 29 4
gpt4 key购买 nike

上下文:我正在尝试为日常使用的 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 命令(或者至少我没有成功使其工作)。

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

我怎样才能克服这个问题?

最佳答案

它与 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=$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只使用双引号,变量被解释
  • 因为我们使用的 eval $final_cmd 命令被很好地解释了,所以 bash 很高兴。

最后是一个用法示例:

bash /tmp/dockerize.sh 5b02ab015730 world

给予

running command: "docker exec -it 5b02ab015730 bash -c "echo Hello, world""
Hello, world

关于bash - 在 'bash -c' 命令中执行 'docker exec',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214436/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com