使用`bash -c`设置$ PS4

时间:2018-05-31 14:45:02

标签: bash shell

我试图为$PS4命令设置bash -c。例如:

bash -xc 'PS4='$(date "+%s.%N ($LINENO) + ")'; echo ABC; echo XYZ'

我试图以各种方式逃避报价,美元符号和括号,但没有成功。

我期望的输出是这个,可以使用具有/bin/bash -x shebang和$PS4定义的shell脚本获得:

#!/bin/bash -x 

PS4='$(date "+%s.%N ($LINENO) + ")'
echo ABC
echo XYZ

产生:

...
11527777373.733823550 (4) + echo ABC
11527777373.754886273 (5) + echo XYZ
...

如何为bash -c ...命令实现类似的目标?

2 个答案:

答案 0 :(得分:3)

一种方法是使用$'...'引用,它允许嵌入单引号:

bash -xc $'PS4=\'$(date "+%s.%N ($LINENO) + ")\'; echo ABC; echo XYZ'

如果您可以在没有纳秒分辨率的情况下生活,我建议使用\D提示转义而不是date

bash -xc $'PS4=\'\\D{%s} ($LINENO) + \'; echo ABC; echo XYZ'

请注意,您可以通过环境传递值来简化引用,但出于安全原因,如果以{root}身份运行bash,则无法执行此操作。 (bash将忽略环境中找到的PS4的任何值。)

PS4='\D{%s} ($LINENO) + ' bash -xc 'echo ABC; echo XYZ'

答案 1 :(得分:2)

为了完整起见(添加到already-quite-good answer from chepner),您可以使用带引号的heredoc将代码放入变量中而不进行修改;然后在双引号上下文中扩展该变量将通过字面意思传递其内容:

If FirstDateRead > Cdate(ws.Cells(i, 1).Value) Then
    ws.Cells(i, 3).Value = 121325
End If