为什么 echo $(crontab -l) 输出当前工作目录列表,然后才输出 crontab 文件本身的内容?

为什么 echo $(crontab -l) 输出当前工作目录列表,然后才输出 crontab 文件本身的内容?

那么如果cwd/tmp现在的话:

crontab -l
> #min hour day mon dow  command
> * * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

但:

echo $(crontab -l)
> #min hour day mon dow  command 0004d519be91d 0004d519d798b launch-0NKnNe launch-NdhkpV
launch-bqJRD2 launch-zac20v launchd-276.rbWQ6r 0004d519be91d 0004d519d798b launch-0NKnNe
launch-NdhkpV launch-bqJRD2 launch-zac20v launchd-276.rbWQ6r 0004d519be91d 0004d519d798
launch-0NKnNe launch-NdhkpV launch-bqJRD2 launch-zac20v launchd-276.rbWQ6r 0004d519be91d 
0004d519d798b launch-0NKnNe launch-NdhkpV launch-bqJRD2 launch-zac20v launchd-276.rbWQ6r 
0004d519be91d 0004d519d798b launch-0NKnNe launch-NdhkpV launch-bqJRD2 launch-zac20v 
launchd-276.rbWQ6r /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

所以第一的行 +/tmp内容 +最后的crontab 行

为什么会有这样的行为?我$(crontab -l)需要if [[ $(crontab -l | grep "^...$") =~ "^...$"]]

答案1

您获得文件列表是因为“crontab -l”返回星号(*),然后将其解释为 glob 字符。

我建议您在测试的 shell 脚本中使用“set -f”来关闭 glob 解释:

set -f
if $(crontab -l | grep -q "^...$"); then
  # your stuff
fi
set +f

答案2

改进以前的答案,在子shell中运行命令没有任何价值。

if crontab -l | grep -q '^...$'; then
    your stuff
fi

需要强调的是,这避免了需要,因为只检查set -f输出代码。grep

相关内容