ack在linux中使用crontab输出任何内容

时间:2017-09-14 12:51:38

标签: linux bash cron ack

ack在linux中使用crontab输出任何内容。

在crontab文件中(使用sudo crontab -e编辑):

39 20 * * * /ext/test110.sh

cat /ext/test110.sh将显示

#! /bin/sh

/usr/bin/ack "localhost" /etc/hosts > /ext/1.t
which ack > /ext/2.t

在cron之后,/ext

中有1.t和2.t.

cat 2.t将输出/usr/bin/ack; 但是,1.t中没有任何内容。

如果我在bash(4.3.30)中运行ack "localhost" /etc/hosts > /ext/3.t或直接运行, 它将输出:127.0.0.1 localhost

似乎ack无法与cron一起使用。这个bug在哪里?谢谢。

uname -a

Linux xxx 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux

ack 2.14,在/ usr / bin / perl下在Perl 5.20.2下运行

2 个答案:

答案 0 :(得分:1)

Ack可能会抛出一个错误,但你没有看到,因为你只是管道stdout并且错误被写入std err。

根据经验,除非你有充分的理由不这样做,否则总是抓住cron日志中的stderr。

使用以下命令重定向流:

 [stream-no]>[destination]

如果没有给出流no,则bash将默认为1,这对应于stdout,所以:

>/file == 1>/file

您可以使用stderr file-no,2来执行stderr。将stderr发送到文件:

2>/file 

您可以使用& file-no作为目标将流发送到另一个。您可以使用以下命令将stderr发送到与stdout相同的位置:

2>&1

所以在你的脚本中尝试这个。运行ack,将stderr与stdout一起发送到file-no 1,然后将所有进入file-no 1的内容发送到日志文件中。

/usr/bin/ack "localhost" /etc/hosts 2>&1 > /ext/1.t 

检查输出。我打赌你现在得到一些文字,很可能是一个你无法智能修复的错误。

答案 1 :(得分:0)

/usr/bin/ack --nofilter "localhost" /etc/hosts > /ext/1.t有效。

长答案请参阅https://github.com/beyondgrep/ack2/issues/649