我已经找到了一个解决方案但尚未找到解决方案。
我创建了一个脚本,它执行一些操作(安装应用程序,更新,创建目录等),其中一行给我带来了问题。
我试图将一个命令回显到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"
我尝试过使用echo cat和引号的变体,但还没有到来。
我需要在Ubuntu和Centos上执行此操作,不确定命令是否会有所不同。
答案 0 :(得分:0)
可以使用ASCII码:
echo -e '\x60'
但实际上我并不认为现在任何地方都会使用反引号。
答案 1 :(得分: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"
答案 2 :(得分: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}'
答案 3 :(得分:0)
如果您遇到复杂的引用问题,请使用引用的heredoc:
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'