Почему скрипт запуска, указанный в переменной ENV, выполняется дважды в sh?

Вопрос или проблема

Я хочу выполнить некоторые действия при открытии терминала без входа в систему, но по какой-то причине это происходит дважды. По умолчанию в системе используется оболочка sh, символическая ссылка на bash.

Я установил значение в переменной окружения ENV на $HOME/.shinit, чтобы оно выполнялось при открытии терминала (эквивалентно .bashrc в bash). В файле .shinit я для тестирования добавил только echo "Test", и проблема в том, что при открытии терминала это выводится дважды.

Я использую RHEL 8.10.

У кого-то есть идеи, почему это происходит? Буду признателен за любые советы/помощь, спасибо.

Скриншоты содержимого переменной ENV и скрипта .shinit.

sh-4.4$ echo $ENV
~/.shinit
sh-4.4$ cat .shinit
echo Test
sh-4.4$

Вывод после открытия терминала.

Test
Test
sh-4.4$

Ответ или решение

Вопрос о том, почему скрипт инициализации, указанный в переменной окружения ENV, выполняется дважды при открытии терминала в оболочке sh, требует глубокого анализа механизма работы оболочки и конфигурационных файлов.

Причины двойного выполнения скрипта

При открытии терминала с оболочкой sh, происходит несколько процессов инициализации. Характерной особенностью sh является то, что она может запускаться в нескольких режимах: как интерактивная оболочка, так и неинтерактивная. Переменная окружения ENV используется для указания скрипта, который должен выполняться каждый раз при старте интерактивной сессии sh, аналогично тому, как .bashrc используется в bash.

Возможные причины двойного исполнения:

  1. Множественные вызовы оболочки: Если при открытии терминала по умолчанию вызывается несколько экземпляров sh, каждый из которых выполняет скрипт, то это приводит к тому, что команды в ~/.shinit будут выполнены столько раз, сколько раз запускается sh. Например, бывают случаи, когда в конфигурации среды описаны какие-то специальные параметры, запускающие дополнительные подчиненные оболочки.

  2. Неправильные конфигурации: Если в конфигурационных файлах (например, ~/.bash_profile или ~/.bashrc) есть команды, вызывающие sh напрямую, это также может привести к двойному выполнению. Проверка на наличие строк, которые могут запускать sh, может помочь выявить проблему.

  3. Системные скрипты инициализации: Иногда системные скрипты или скрипты в каталоге /etc/profile.d/ могут быть настроены на запуск дополнительных сеансов оболочки, что также приведет к дублированию вызовов.

Рекомендации по устранению проблемы:

  1. Проверка конфигурационных файлов: Проверьте содержание ~/.bash_profile, ~/.bashrc и других файлов инициализации на наличие вызовов sh. Убедитесь, что в них нет нежелательных инструкций.

  2. Тестирование с чистым окружением: Попробуйте временно переименовать ваши конфигурационные файлы и запустить терминал, чтобы увидеть, выполняется ли ~/.shinit только один раз. Это поможет определить, есть ли влияние других файлов.

  3. Логирование: Добавьте команды в ~/.shinit, которые выводят в лог файл, чтобы отследить момент вызова скрипта. Например:

    echo "$(date): Test" >> $HOME/debug.log
  4. Изолированное тестирование: Если возможно, создайте нового пользователя и проверьте поведение терминала в его профиле. Это поможет определить, связана ли проблема с конкретно вашей конфигурацией или с системными параметрами.

Заключение

Двойное выполнение скрипта может быть вызвано множественными факторами, включая конфигурационные ошибки и особенности работы самой оболочки. Применение предложенных шагов по диагностике и устранению может помочь выяснить источник проблемы. Если, после всех проверок, проблема останется нерешенной, стоит обратиться к документации sh или сообществу разработчиков, предоставив полные сведения о конфигурации среды.

Оцените материал
Добавить комментарий

Капча загружается...