bash - 在 shell 脚本中取消引用参数扩展的环境变量
问题描述
我正在尝试使用参数扩展取消引用环境变量的值$@
,但它似乎不起作用。
我需要调用带有某些参数的 shell 脚本。参数列表包含环境变量,并且环境变量应该出现在要执行 shell 脚本的位置。我事先不知道命令列表,所以我使用$@
. 但是,该脚本无法取消引用环境变量的值。
可以按如下方式完成解释我的问题的最小设置。
- Dockerfile
FROM alpine:3.10
ENV MY_VAR=production
WORKDIR /app
COPY run.sh .
ENTRYPOINT [ "sh", "run.sh" ]
- 运行.sh
#!/bin/sh
echo "Value of MY_VAR is" $MY_VAR
echo "Begin"
$@
echo "Done"
我可以使用docker build . -t env-test
. 当我使用 运行它时docker run env-test:latest 'echo $MY_VAR'
,我得到以下输出。
Value of MY_VAR is production
Begin
$MY_VAR
Done
虽然我期望的输出是:
Value of MY_VAR is production
Begin
production
Done
旁注:实际上,我正在尝试使用如下 compose 文件运行它:
version: '3'
services:
run:
image: env-test:latest
command: echo $$MY_VAR
但它再次给了我类似的结果。
解决方案
扩展该eval
方法,这是一个简单的 bash 脚本,它将使用 eval 将字符串评估为一系列 bash 命令:
#!/usr/bin/env bash
echo program args: $@
eval $@
但要小心,eval
伴随着危险:
https://medium.com/dot-debug/the-perils-of-bash-eval-cc5f9e309cae
推荐阅读
- css - 用 css 平滑动画缩放对象
- vb.net - 如何在打印预览对话框中显示多个页面?
- python - 如何在 python 中的 csv 中导入 3D 表?
- java - 本地路径的 OSGi httpService.registerResources()
- java - 用 Java 构建一个“关于我”的 GUI 页面
- python-sockets - 虽然我可以通过 tcpdump 看到流,但无法接收多播数据包
- git - GIT:重新定位同一“线程”上的几个分支
- angular - 是否从 'rxjs/internal/Observable' 导入 { Observable };可以接受吗?
- c - C 套接字中的 recv() 对某些请求返回 0
- cxf - CXF 请求重试