У меня есть сценарий, который выполняет некоторую уборку, отлично работает при вызове из интерактивной оболочки, но ничего не делает при вызове cron. Чтобы решить эту проблему, я запустил оболочку с «пустой» средой с помощью команды:
env -i /bin/bash --noprofile --norc
Используя этот пустой env, я углубился в свой скрипт и обнаружил, что следующие grep
не будет соответствовать никаким файлам:
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
Однако при запуске из интерактивной оболочки команда вернет имена файлов соответствующих файлов.
Обратите внимание, что выражение соответствует таким строкам, как: WS_STATUS = "remove"
Методом проб и ошибок я обнаружил, что добавление -P
к параметрам [Perl regex] команда начала нормально работать в «пустой» оболочке. Однако у меня есть без понятия почему моя оболочка входа в систему по умолчанию grep -P
.
grep
двоичный /bin/grep
grep=pgrep
или grep="grep -P"
GREP_OPTIONS
определено.В чем дело?
Примечание: ОС - RHEL v5.10, Bash - v3.2.25, grep - v2.5.1
Есть ли какие-либо из этих переменных et?
GREP_OPTIONS, LC_ALL, LC_COLLATE, LANG, LC_CTYPE, LC_MESSAGES или POSIXLY_CORRECT
Любой из них может повлиять на поведение grep.
Вы можете попробовать «установить -x», чтобы увидеть отдельные выполняемые команды. Вы также можете переместить команды в сценарий оболочки и вызвать его из cron. Так вам будет проще добавлять такие команды, как set
, env
, и set -x
легче.
#!/bin/bash
echo SET
set
echo ENV
env
set -x
grep -il "^ws_status\s*=\s*[\"']remove[\"']$"
exit