2017-07-18 95 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'