【发布时间】:2015-08-20 09:24:47
【问题描述】:
这让我沮丧了好几个小时。我围绕 Perl 单行编写了一个简单的包装器来更新一些 DNS 区域文件中的序列。
我觉得有必要补充一下:- 不要提供其他方法来做到这一点,好吗?这是关于为什么这不起作用,而不是关于如何通过其他方式达到结果。
这是我的简单脚本
#!/bin/bash
#loop through the supplied files updating the timestamp (serial)
SERIAL=`date +%Y%m%d%H%M`;
for name in $@
do
saCMD="'s/^(\W*)\d*.*;\W*serial/\${1}$SERIAL ; serial/g'"
#echo the command
echo "perl -pi -e "$saCMD" $name"
#execute the command
`perl -pi -e $saCMD $name`
done
我尝试了多种不同的方法,但都以静默方式或消息失败
在 -e 第 1 行的 EOF 之前的任何地方都找不到字符串终止符“'”..
如果我执行回显的命令,它会正常工作
我使用的是 Debian 7 系统
谁能指出我为什么没有像我期望的那样执行?
编辑:
一些示例数据
$TTL 300
domain.org. IN SOA ns1.domain.com. admin.domain.org. (
2014090914 ; serial, todays date+todays
7200 ; refresh, seconds
7200 ; retry, seconds
2419200 ; expire, seconds
3600 ) ; minimum, seconds
感兴趣的线路是2014090914 ; serial, todays date+todays
【问题讨论】:
-
出于兴趣 - 如果省略反引号,它会起作用吗?我问的原因 - 反引号会产生一个子shell,我认为它可能会打开另一层引号。
-
反引号没有明显区别。
-
奇数。因为像这样内联反引号应该导致执行该 perl 命令的输出。
-
它不只是将输出返回给脚本吗?就像我如何格式化时间戳一样?由于 perl 没有返回错误,所以没有输出。同样的命令在 Centos 上完美运行。 (虽然我最近没有测试过)