
Я хочу, чтобы мои скрипты cron выполнялись подробно при интерактивном запуске пользователем системы (например, для отладки) и тихо в противном случае (для cron, поскольку я хочу получать электронную почту только в случае возникновения ошибок).
Я попробовал это в своем сценарии:
case "$-" in
*i*) echo "this shell is interactive" > /tmp/log;
*) echo "this shell isn't" > /tmp/log;
esac
но даже при интерактивном запуске (/bin/bash /tmp/my_script.sh) он всегда возвращает «эта оболочка не является» и
echo $-
в скрипте оболочки возвращается hB, а не hiB.
Я тоже пробовал
if [ -z $PS1 ]
думая, что cron не установил $PS1, но опять же, из командной строки echo $PS1 возвращает эту переменную, а в интерактивном режиме в скрипте он ничего не возвращает :/
Мне бы хотелось узнать, почему в интерактивном режиме (/bin/bash my_script.sh) не возвращается значение i для $- и значение $PS1.
Большое спасибо за вашу помощь!
решение1
Вы могли быпроверить, является ли stdin tty.
В качестве альтернативы вы можете добавить в свой скрипт флаг, сообщающий ему, что он должен быть тихим или многословным, а не заставлять его угадывать.
решение2
Вы можете установить переменную среды в cron и проверить ее.
Разместите THISISCRON=1 в отдельной строке над записью cron.
решение3
Скрипты Bash никогда не имеют интерактивной опции. Они неинтерактивны везде.