如何让crontab在URL中使用curl和&符号工作?

问题描述:

我发送GET请求URL如何让crontab在URL中使用curl和&符号工作?

http://localhost:8082/email-bulk?customer=Martin+Thoma&handler_pid=foo+f0a474c5-3cb1-4872-8689-c65cedb15bff&format_string=%7Breceived%3A%25y%25m%25d%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D%7Bfile_extension%7D&minutes_email=2 
每分钟

。所以我设置crontab项为

* * * * * /usr/bin/curl --silent "http://localhost:8082/email-bulk?customer=Martin+Thoma&handler_pid=foo+f0a474c5-3cb1-4872-8689-c65cedb15bff&format_string=%7Breceived%3A%25y%25m%25d%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D%7Bfile_extension%7D&minutes_email=2" 

但是服务器没有收到任何请求。

随着

* * * * * /usr/bin/curl --silent http://localhost:8082/email-bulk?customer=Martin+Thoma&handler_pid=foo+f0a474c5-3cb1-4872-8689-c65cedb15bff&format_string=%7Breceived%3A%25y%25m%25d%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D+%7Bfoo%7D%7Bfile_extension%7D&minutes_email=2 

它接收到

http://localhost:8082/email-bulk?customer=Martin+Thoma 

请求我怎样才能在不使用外部脚本这项工作?

不使用引号和转义&%\似乎工作。但我仍然想知道为什么使用引号不起作用/哪些字符需要转义以及为什么。

(所以我不会接受这个答案)

单引号替换您的双引号,和外壳不会尝试解析URL。

如果你不使用引号,你的shell会将你的字符串解释为由&分割的一组命令,并在后台执行&之前的所有内容。 (除非你逃脱字符\&

为了测试这个试试这个在您的终端

$ echo 1 & echo 2 

的输出将是这样的:

$ echo 1 & echo 2 
[1] 2188 
2 
1 
[1] + done  echo 1 

在您的例子命令的一部分将在后台执行:

/usr/bin/curl --silent http://localhost:8082/email-bulk?customer=Martin+Thoma & 

但是字符串的其余部分,因为是不是一个有效的命令,你会得到错误,例如:

$ echo 1 & foo 
[1] 2244 
1 
[1] + done  echo 1 
zsh: command not found: foo 

从人bash

如果一个命令是由控制操作&,shell将执行终止在子shell中的后台命令。

因此,通过使用引号,你的shell不解析字符串,例如:

$ echo "1 & foo" 
1 & foo 

取决于你的shell来逃避什么,什么不是,检查这个答案的详细信息:https://unix.stackexchange.com/a/296147/53084