为什么在 crontab 中带引号的参数有不同的行为?

为什么在 crontab 中带引号的参数有不同的行为?

案例场景:

$ echo "1,2,4" | grep -v [0-9]
[No results, as expected]

但是,当通过以下方式进行时cron

$ crontab -l
[...]
* * * * * echo "1,2,4" | grep -v [0-9] > /tmp/debug.dump
[...]
$ cat debug.dump
1,2,4

解决方案(或者可能是解决方法,我不知道):

$ crontab -l
[...]
* * * * * echo "1,2,4" | grep -v "[0-9]" > /tmp/debug.dump
[...]
$ cat debug.dump
[No results, as expected]

我想理解这个问题,而不是仅仅解决它然后忘记它。

为什么双引号可以解决这个问题?

注意:这是 FreeBSD v10.3。

答案1

运行此 cron 作业的用户的主目录中有一个名为 0、3、5、6、7、8 或 9 的文件。 shell 将未加引号的[0-9]参数扩展为该文件名(假设是0);由于0输入中没有' ,因此grep -v“成功”并且不打印任何内容。

当您进行测试时,您位于不同的目录中(没有一位数文件名的目录)。双(或单)引用参数可防止 shell 扩展该 glob,从而允许 grep 将其视为范围。

相关内容