Subj на Debian 8.Пробую разные варианты, но или баш интерпретируют * как показать файлы, то "grep: заданы конфликтующие образцы"
if [ $(egrep -P "^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null" /var/spool/cron/crontabs/root) ]; then
echo "good";
else
echo bad;
fi
perl ?perl -lne 'print "ok" if m|\*\s+\*\s+\*\s+\*\s+\*\s+/bin/bash /root/script.sh > /dev/null|' /var/spool/cron/crontabs/root
можно конечно и без \s+ но кто знает tab там или пробел и сколько их
> perl ?
> perl -lne 'print "ok" if m|\*\s+\*\s+\*\s+\*\s+\*\s+/bin/bash /root/script.sh
> > /dev/null|' /var/spool/cron/crontabs/root
> можно конечно и без \s+ но кто знает tab там или пробел
> и сколько ихПерл работает.
А grep? awk?
^\s*\*\s+\*\s+\*\s+\*\s+\*\s+/bin/bash\s+/root/script.sh\s*$
Убери "-P" и должно работать.
> Убери "-P" и должно работать.
# sh test8.sh
+ egrep ^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null /var/spool/cron/crontabs/root
+ [ ftp_access.file system_info test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh ftp_access.file script.sh system_info test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh ftp_access.file script.sh system_info test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh ftp_access.file script.sh system_info test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh ftp_access.file script.sh system_info test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh /bin/bash script.sh > /dev/null ]
test8.sh: 5: [: ftp_access.file: unexpected operator
+ echo bad
bad
#!/bin/bash
egrep "^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null" /var/spool/cron/crontabs/root
if (($?)); then
echo "bad"
else
echo "good"
fiА Debian sh в вообще bash?
>
> #!/bin/bash
> egrep "^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null" /var/spool/cron/crontabs/root
> if (($?)); then
> echo "bad"
> else
> echo "good"
> fi
>
> А Debian sh в вообще bash?
-rwxr-xr-x 1 root root 1029624 ноя 5 2016 /bin/bash
lrwxrwxrwx 1 root root 4 ноя 8 2014 /bin/sh -> dash
Ошибки все равно одинаковые.
> if [ $(egrep -P "^\* \* \* \* \* /bin/bash /root/script.sh >проверил на старой фре работает, на старом линухе НЕ работает, также
> egrep -P "1" *egrep: conflicting matchers specified
но если использовать просто grep
> grep -P "^.*01.*\*" *crontab:01 * * * * root run-parts /etc/cron.hourly
то однако работает ...
>> if [ $(egrep -P "^\* \* \* \* \* /bin/bash /root/script.sh >
> проверил на старой фре работает, на старом линухе НЕ работает, также
>> egrep -P "1" *
> egrep: conflicting matchers specified
> но если использовать просто grep
>> grep -P "^.*01.*\*" *
> crontab:01 * * * * root run-parts /etc/cron.hourly
> то однако работает ...Потому, что egrep это grep -E, a -E и -P конфликтуют.
$ cat /bin/egrep
#!/bin/sh
exec grep -E "$@"
>
> "grep: заданы конфликтующие образцы"
>
> if [ $(egrep -P "^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null" /var/spool/cron/crontabs/root) ];
grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
>>
>> "grep: заданы конфликтующие образцы"
>>
>> if [ $(egrep -P "^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null" /var/spool/cron/crontabs/root) ];
>
> grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
>Тоже самой, что и выше. * считается как все файлы внутри директории.
# sh test10.sh
+ grep ^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null /var/spool/cron/crontabs/root
+ [ ftp_access.file script.sh system_info test10.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh test9.sh ftp_access.file script.sh system_info test10.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh test9.sh ftp_access.file script.sh system_info test10.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh test9.sh ftp_access.file script.sh system_info test10.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh test9.sh ftp_access.file script.sh system_info test10.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh test9.sh /bin/bash /root/script.sh > /dev/null ]
test10.sh: 7: [: ftp_access.file: unexpected operator
+ echo bad
bad
>> grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
> Тоже самой, что и выше. * считается как все файлы внутри директории.Кто у Вас шелл ? Или куда и как эту команду вставляете и кто её исполняет, разные ли это "люди"?
>>> grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
>> Тоже самой, что и выше. * считается как все файлы внутри директории.
> Кто ... куда ... как ... и кто ...?Опять путает консоли, на BSD небось :)
>>>> grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
>>> Тоже самой, что и выше. * считается как все файлы внутри директории.
>> Кто ... куда ... как ... и кто ...?
> Опять путает консоли, на BSD небось :)Если бы для BSD тестил - сразу бы написал.
Не надо гнать.
>>> grep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null"
>> Тоже самой, что и выше. * считается как все файлы внутри директории.
> Кто у Вас шелл ? Или куда и как эту команду вставляете
> и кто её исполняет, разные ли это "люди"?Скрипт запускал через sh, bash и dash.
Одинаковый результат.
> Тоже самой, что и выше. * считается как все файлы внутри директории.
> # sh test10.sh
> + grep ^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null /var/spool/cron/crontabs/root[ ] - это IEEE Std 1003.1, 2004 (POSIX1), 9.3.5 RE Bracket Expression
Я на 146% поверю POSIX, чем в нежопорукость. Оно даже на Венде должно сработать.
$ cat test10.shgrep "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null" /tmp/test;
$ cat /tmp/test* * * * * /bin/bash /root/script.sh > /dev/null
$ /bin/bash -x test10.sh
+ grep '^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null' /tmp/test
* * * * * /bin/bash /root/script.sh > /dev/null$ /bin/dash -x test10.sh
+ grep ^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null /tmp/test
* * * * * /bin/bash /root/script.sh > /dev/null$ cat /etc/debian_version
8.10
P.S.
universite: Прим. с 2003 года Linux не нужно настраивать, это не BSD, тут всё работает. :D
> $ cat /etc/debian_version
> 8.10
>
# cat /etc/debian_version
8.9
У вас там нет никаких алиасов на grep?
Покажите alias
> У вас там нет никаких алиасов на grep?alias grep='grep --color=auto'
> А что ему писать?
> Что у него нет азов программирования и администрирования? Нет профильного образования?
> Или что виновато правительство, что набирает идиотов на рабочие специальности?
echo '* * * * * /bin/bash /root/script.sh > /dev/null' | grep -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ; echo $?
0echo '* * * * * /bin/bash /root/script.sh < /dev/null' | grep -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ; echo $?
1
>
> echo '* * * * * /bin/bash /root/script.sh > /dev/null' | grep
> -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ;
> echo $?
> 0
> echo '* * * * * /bin/bash /root/script.sh < /dev/null' | grep
> -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ;
> echo $?
> 1
>А вы считайте с файла, а не с pipe.
# bash test9.sh
++ grep -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' /var/spool/cron/crontabs/root
+ '[' ']'
+ echo bad
bad
>[оверквотинг удален]
>>
> А вы считайте с файла, а не с pipe.
>
> # bash test9.sh
> ++ grep -q '^\* \* \* \* \* /bin/bash /root/script.sh > /dev/null'
> /var/spool/cron/crontabs/root
> + '[' ']'
> + echo bad
> bad
>Считал все хорошо:
./test.sh
a 0
b 1
$cat test.sh#!/bin/bash
if grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ./root; then
echo "a $?"
else
echo "b $?"
fi#!/bin/bash
if grep -q '\* \* \* \* \* /bin/bash /root/script.sh < /dev/null' ./root; then
echo "a $?"
else
echo "b $?"
fi$cat root
* * * * * /bin/bash /root/script.sh > /dev/null
>[оверквотинг удален]
> fi
> #!/bin/bash
> if grep -q '\* \* \* \* \* /bin/bash /root/script.sh < /dev/null'
> ./root; then
> echo "a $?"
> else
> echo "b $?"
> fi
> $cat root
> * * * * * /bin/bash /root/script.sh > /dev/nullна убунту (тот же дебиан), на центосе - выполняется корректно
> $cat test.sh
> #!/bin/bash
> if grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null'
> ./root; then
> echo "a $?"
> else
> echo "b $?"
> fiНашел отличие.
так не работает:
#!/bin/bash
if [ $(grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ./root) ]; then
echo "a $?"
else
echo "b $?"
fiА так работает:
#!/bin/bash
if $(grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ./root); then
echo "a $?"
else
echo "b $?"
fi
или
#!/bin/bash
if grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null' ./root; then
echo "a $?"
else
echo "b $?"
fiТак почему тест в квадратных скобках не проходит?
>[оверквотинг удален]
>
> #!/bin/bash
> if grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null'
> ./root; then
> echo "a $?"
> else
> echo "b $?"
> fi
>
> Так почему тест в квадратных скобках не проходит?http://qaru.site/questions/83027/when-are-square-brackets-re...
>[оверквотинг удален]
>> #!/bin/bash
>> if grep -q '\* \* \* \* \* /bin/bash /root/script.sh > /dev/null'
>> ./root; then
>> echo "a $?"
>> else
>> echo "b $?"
>> fi
>>
>> Так почему тест в квадратных скобках не проходит?
> http://qaru.site/questions/83027/when-are-square-brackets-re...Ок. Понял.
> Так почему тест в квадратных скобках не проходит?Что ты хотел словить после grep -q ?
При совпадении пустая строка (\x00) возвращается.
Делай раздельно и не захламляй код.
if [ -z "$(grep -q "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null" /tmp/test)" ];
then
echo OK;
fiif [ ! -n "$(grep -q "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null" /tmp/test)" ];
then
echo OK;
fi
grep -q "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null" /tmp/test;
if [ $? -ne 0 ];
then
echo OK;
fi
>[оверквотинг удален]
>
> echo OK;
> fi
> Делай раздельно и не захламляй код.
> grep -q "^[*] [*] [*] [*] [*] /bin/bash /root/script.sh [>] /dev/null" /tmp/test;
> if [ $? -ne 0 ];
> then
>
> echo OK;
> fiБудет всегда "Ок" показывать.
Добавь в регулярку пару лишних символов и увидишь.
> Будет всегда "Ок" показывать.
> Добавь в регулярку пару лишних символов и увидишь.А, ну да, моя косяк.
if [ $? -eq 0 ]; ...
>> Будет всегда "Ок" показывать.
>> Добавь в регулярку пару лишних символов и увидишь.
> А, ну да, моя косяк.
>
> if [ $? -eq 0 ]; ...
>Еще одна "мелочь":
Нужно отрицательное значение.
если _не_ найдена регулярка, то выполнить что-то там.
>>> Будет всегда "Ок" показывать.
>>> Добавь в регулярку пару лишних символов и увидишь.
>> А, ну да, моя косяк.
>>
>> if [ $? -eq 0 ]; ...
>>
> Еще одна "мелочь":
> Нужно отрицательное значение.
> если _не_ найдена регулярка, то выполнить что-то там.это уже есть выше и вами было отвергнуто как ошибочное:
if [ $? -ne 0 ];
>[оверквотинг удален]
>>>> Добавь в регулярку пару лишних символов и увидишь.
>>> А, ну да, моя косяк.
>>>
>>> if [ $? -eq 0 ]; ...
>>>
>> Еще одна "мелочь":
>> Нужно отрицательное значение.
>> если _не_ найдена регулярка, то выполнить что-то там.
> это уже есть выше и вами было отвергнуто как ошибочное:
> if [ $? -ne 0 ];Да, мой косяк, где-то тесты не то тестировали :)
> если не, то что-то там./dev/extrasensor Not Found
http://tldp.org/LDP/abs/html/refcards.html#AEN22473
http://tldp.org/LDP/abs/html/testconstructs.html
А почему бы просто не проверять на незакомментированную строку с искомым скриптом?if grep -qs '^[ ]*[^ #].*/root/script.sh' /var/spool/cron/crontabs/root; then
echo OK
else
echo BAD
fi