如何执行带双引号的bash变量并实时获取输出

How to execute bash variable with double quotes and get the output in realtime

我有一个变量,其中有一个我想要 运行 的命令。 它有一堆双引号。当我回应它时,它看起来很漂亮。

我可以复制粘贴它 运行 就好了。

我简单地尝试了 $cmd,但它不起作用。我收到一个错误,好像命令格式不正确。

然后我尝试通过 eval "$cmd" 或类似的方法 bash -c "$cmd" 对其进行 运行 处理,但在命令完成之前我没有得到任何输出 运行宁.

示例bash -c "$cmd"

这个 运行 是命令,但是在命令完成之前我没有得到任何输出 运行ning,这很糟糕,我正在尝试修复它:

cmd="docker run -v \"$PROJECT_DIR\":\"$PROJECT_DIR\" \
    -v \"$PPI_ROOT_DIR/utilities/build_deploy/terraform/modules/\":/ppi_modules \
    --workdir \"$PROJECT_DIR/terraform\" \
    --env TF_VAR_aws_account_id=$AWS_ACCOUNT_ID \
    --env TF_VAR_environment=${ENVIRONMENT} \
    --env TF_VAR_region=${AWS_DEFAULT_REGION:-us-west-2} \
    ${OPTIONAL_AWS_ENV_VARS} \
    ${CUSTOM_TF_VARS} \
    ${TERRAFORM_BASE_IMAGE} \
    init --plugin-dir=/.terraform/providers \
        -reconfigure \
        -backend-config=\"bucket=${AWS_ACCOUNT_ID}-tf-remote-state\" \
        -backend-config=\"key=${ENVIRONMENT}/${PROJECT_NAME}\" \
        -backend-config=\"region=us-west-2\" \
        -backend-config=\"dynamodb_table=terraform-locks\" \
        -backend=true"
# command output looks good. I can copy and paste it and run it my terminal too.
echo $cmd
# Running the command via bash works, 
# but I don't get the output until the command is done running, 
# which is what I'm trying to fix:
bash -c "$cmd"

这里是一个使用 bash 数组的例子。 它完美地将它打印到屏幕上,但就像 运行 像 $cmd 一样,它会抛出一个错误,就好像命令格式不正确一样:

cmd=(docker run -v \"$PROJECT_DIR\":\"$PROJECT_DIR\" \
    -v \"$PPI_ROOT_DIR/utilities/build_deploy/terraform/modules/\":/ppi_modules \
    --workdir \"$PROJECT_DIR/terraform\" \
    --env TF_VAR_aws_account_id=$AWS_ACCOUNT_ID \
    --env TF_VAR_environment=${ENVIRONMENT} \
    --env TF_VAR_region=${AWS_DEFAULT_REGION:-us-west-2} \
    ${OPTIONAL_AWS_ENV_VARS} \
    ${CUSTOM_TF_VARS} \
    ${TERRAFORM_BASE_IMAGE} \
    init --plugin-dir=/.terraform/providers \
        -reconfigure \
        -backend-config=\"bucket=${AWS_ACCOUNT_ID}-tf-remote-state\" \
        -backend-config=\"key=${ENVIRONMENT}/${PROJECT_NAME}\" \
        -backend-config=\"region=us-west-2\" \
        -backend-config=\"dynamodb_table=terraform-locks\" \
        -backend=true)

echo "${cmd[@]}"

"${cmd[@]}"

如何执行带有双引号的 bash 变量,但 运行 它让我实时获得输出,就像我通过 $cmd 执行一样(不起作用)

与这些问题类似,但我的问题是 运行 它并实时获取输出:

Execute command containing quotes from shell variable

Bash inserting quotes into string before execution

在您的数组版本中,由反斜杠转义的双引号成为参数的一部分,这不是预期的。

因此删除反斜杠应该可以解决问题。