如何让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