我试图为$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 ...
命令实现类似的目标?
答案 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