2017-07-18 99 views
1

我已经搜索了一个解决方案,但还没有找到一个解决方案。不执行回声命令到cron

我已经创建了一个脚本,它执行一些操作(安装应用程序,更新,制作目录等),其中一行提供了问题。

我想回声一个命令回声到crontab中,其中有反命令。例如,我想的crontab看起来像这样:

* * * * * mon-put-instance-data.pl --disk-space-util `df --output=source | grep /dev/ | /bin/awk '{print "--disk-path="$0}' 

取而代之的是,虽然我的脚本首先在反引号执行该命令,然后回显到的crontab是这样的:

* * * * * mon-put-instance-data.pl --disk-space-util --disk-path=/dev/xvda1 

目前线,应该回显这个cron工作,看起来像这样:

sudo sh -c "echo \* \* \* \* \* mon-put-instance-data.pl --disk-space-util `df --output=source | grep /dev/ | /bin/awk '{print "--disk-path="$0}' | /usr/bin/tr '\n' ' '` >> /etc/crontab" 

我已经尝试了回声猫和引号的变体,但还没有出现。

我需要在Ubuntu和Centos上这样做,不知道这些命令是否会有所不同。

回答

0

可以使用ASCII代码:

echo -e '\x60' 

但实际上我不认为反引号现今任何地方使用。

+0

要添加,而不是使用'somecommand'使用$(somecommand) –

0

单引号使用'\''

sudo sh -c "echo '* * * * * mon-put-instance-data.pl --disk-space-util \`df --output=source | grep /dev/ | /bin/awk '\''{print \"--disk-path=\"\$0}'\'' | /usr/bin/tr '\''\n'\'' '\'' '\''\`' >> /tmp/crontab" 
0

您可以简单地逃避它:\ 例如:

$ echo "* * * * * mon-put-instance-data.pl --disk-space-util \`df --output=source | grep /dev/ | /bin/awk '{print \"--disk-path=\"\$0}'" 
* * * * * mon-put-instance-data.pl --disk-space-util `df --output=source | grep /dev/ | /bin/awk '{print "--disk-path="$0}' 
+0

你能检查命令是否以这种格式工作“sudo sh -c echo ...” – skr

0

Whenver你有复杂的报价问题,使用引号定界符:

sudo sh -c 'cat > /etc/crontab' << 'EOF' 
* * * * * mon-put-instance-data.pl --disk-space-util $(df --output=source | /bin/awk '/dev/ {print "--disk-path="$0}') 
EOF 

(并停止使用反引号; $()符号更清晰) 虽然,作为一个方面说明,这是一个坏主意。更好地把它放在脚本中,并从cron调用脚本。也就是说,只需将所有逻辑放在mon-put-instance-data.pl中,或者编写一个简单的包装器。而且它看起来更干净df -- output=source | sed -n '/dev/s/^/--disk-path=/p'