![Скрипт bash не может получить разницу в $PS1 или $- при запуске в интерактивном режиме или через cron](https://rvso.com/image/617241/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20bash%20%D0%BD%D0%B5%20%D0%BC%D0%BE%D0%B6%D0%B5%D1%82%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D1%83%20%D0%B2%20%24PS1%20%D0%B8%D0%BB%D0%B8%20%24-%20%D0%BF%D1%80%D0%B8%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B5%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%BC%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5%20%D0%B8%D0%BB%D0%B8%20%D1%87%D0%B5%D1%80%D0%B5%D0%B7%20cron.png)
Я хочу, чтобы мои скрипты 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 никогда не имеют интерактивной опции. Они неинтерактивны везде.