不执行回声命令到cron
我已经搜索了一个解决方案,但还没有找到一个解决方案。不执行回声命令到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上这样做,不知道这些命令是否会有所不同。
可以使用ASCII代码:
echo -e '\x60'
但实际上我不认为反引号现今任何地方使用。
单引号使用'\''
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"
您可以简单地逃避它:\ 例如:
$ 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}'
你能检查命令是否以这种格式工作“sudo sh -c echo ...” – skr
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'
要添加,而不是使用'somecommand'使用$(somecommand) –