echo $variable в cron не работает

У меня проблемы с печатью результата следующего при запуске cron. У меня есть имя сценария в /usr/local/bin/test

#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ARAW=`date +%y%m%d`

NAME=`hostname`

TODAY=`date '+%D %r'`

cd /directory/bar/foo/
VARR=$(ls -lrt /directory/bar/foo/ | tail -1 | awk {'print $8'} | ls -lrt `xargs` | grep something)

echo "Resolve2 Backup" > /home/user/result.txt

echo " " >> /home/user/result.txt

echo "$VARR" >> /home/user/result.txt

mail -s "Result $TODAY" [email protected] < /home/user/result.txt

Я настроил его в /etc/cron.d/test для запуска каждый час ночи:

00 1 * * * root /usr/local/bin/test

Когда я запускаю его вручную в командной строке

# /usr/local/bin/test

Я получаю полное значение. Но когда я позволяю cron выполнять работу, он никогда не отображает часть echo "$VARR" >> /home/user/result.txt

Есть идеи?


person Sympatiko    schedule 27.07.2015    source источник
comment
VARR=$(ls -lrt /directory/bar/foo/ | tail -1 | awk {'print $8'} | ls -lrt xargs` | grep something)` — очень неаккуратная команда, и вам не следует пытаться анализировать вывод ls. Какую информацию вы пытаетесь получить?   -  person arco444    schedule 27.07.2015
comment
Помимо всего прочего в этом беспорядке команда ls -ltr `xargs` удивительно странная/плохая (хотя, думаю, умная).   -  person Etan Reisner    schedule 27.07.2015
comment
Критика синтаксического анализа ls не просто справедлива, вполне вероятно, что ваша проблема - ls чувствительна к ряду переменных оболочки. Вам не нужен -l, если все, что вам нужно, это имя файла; ls покажет только один файл в строке, если его вывод не является tty. Чем то, что вы хотите, отличается от $(ls -lrt | tail -1 | grep something)?   -  person Andrew McGuinness    schedule 27.07.2015


Ответы (2)


VARR=$(ls -lrt /directory/bar/foo/ | tail -1 | awk {'print $8'} | ls -lrt `xargs` | grep something)

ls -ltr /path/to/dir не будет включать каталог в часть имени файла выходных данных. Затем вы снова вызываете ls с этим выводом, и он будет искать в вашем текущем каталоге, а не в /path/to/dir.

В cron ваш текущий каталог, скорее всего, будет /, и при ручном тестировании я уверен, что ваш текущий каталог /path/to/dir

Вот еще один подход к поиску самого нового файла в каталоге, который выдает полное имя пути:

stat -c '%Y %n' /path/to/dir/* | sort -nr | head -1 | cut -d" " -f 2-

Требуется GNU stat, проверьте справочную страницу для правильного вызова для вашей системы.


Я думаю, что ваш вызов VARR может быть:

latest_dir=$(stat -c '%Y %n' /path/to/dir/* | sort -nr | head -1 | cut -d" " -f 2-)
interesting_files=$(ls -ltr "$latest_dir"/*something*)

Тогда нет необходимости во временном файле:

{
    echo "Resolve2 Backup"
    echo
    echo "$interesting_files"
} |
mail -s "Result $TODAY" [email protected]
person glenn jackman    schedule 27.07.2015

Спасибо за все ваши советы и ответы. Я решил свою проблему. Проблема заключается в выводе $8 и $9 в cron. Я не знаю, какое специальное поле читается, пока оно запускается в cron. Я просто новичок в написании сценариев, так что извините за мой плохой сценарий =)

person Sympatiko    schedule 28.07.2015