我正在尝试将$PS4设置为bash -c命令。示例:
bash -xc 'PS4='$(date "+%s.%N ($LINENO) + ")'; echo ABC; echo XYZ'我试着用各种方法摆脱了引号、美元符号和括号,但都没有成功。
我所期望的输出是这样的,它可以通过具有/bin/bash -x shebang的shell脚本和$PS4定义获得:
#!/bin/bash -x
PS4='$(date "+%s.%N ($LINENO) + ")'
echo ABC
echo XYZ产生的结果:
...
11527777373.733823550 (4) + echo ABC
11527777373.754886273 (5) + echo XYZ
...对于bash -c ...命令,我如何实现类似的目标?
发布于 2018-05-31 14:57:56
一种方法是使用$'...'引用,它允许嵌入单引号:
bash -xc $'PS4=\'$(date "+%s.%N ($LINENO) + ")\'; echo ABC; echo XYZ'如果您可以不使用纳秒分辨率,我建议使用\D提示转义,而不是使用date。
bash -xc $'PS4=\'\\D{%s} ($LINENO) + \'; echo ABC; echo XYZ'请注意,您可以通过环境传递值来简化引用,尽管出于安全原因,如果bash作为根用户运行,这将无法工作。(bash将简单地忽略在环境中找到的任何PS4值。)
PS4='\D{%s} ($LINENO) + ' bash -xc 'echo ABC; echo XYZ'发布于 2018-05-31 15:12:59
为了完整性(添加到already-quite-good answer from chepner中),您可以使用引用的heredoc将代码不加修改地放入变量中;然后,在双引用上下文中展开该变量,将其内容从字面上传递给如下内容:
cmd=$(cat <<'EOF'
PS4='$(date "+%s.%N ($LINENO) + ")'
echo ABC
echo XYZ
EOF
)
bash -xc "$cmd"https://stackoverflow.com/questions/50627012
复制相似问题