Я хочу дополнить ответ Рави :
Такое поведение характерно для Ubuntu (и, вероятно, большинства производных дистрибутивов), поскольку ваш ~/.bashrcфайл по умолчанию начинается с короткого замыкания, Ubuntu 18.04, например:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Это остановит оценку файла, если он работает в неинтерактивной оболочке, как в случае с вашим сценарием, поскольку все сценарии выполняются в неинтерактивной оболочке , и впоследствии каждый файл sourceунаследует это свойство.
eval мотыга
Я обнаружил уродливый хак для обхода Ubuntu специально, используя evalвместо source:
eval "$(cat ~/.bashrc | tail -n +10)"
Он просто пропускает несколько первых строк и оценивает оставшуюся часть, ~/.bashrcпоэтому остальные оцениваются и изменяют текущее выполнение.
Имейте в виду, что это магическое число, которое может не работать во всех версиях Ubuntu; но может быть хорошим решением, если вы создаете сценарии для более или менее известных систем.
Более подходящее решение может включать использование регулярных выражений для определения конкретных битов, которые останавливают оценку.
Альтернатива Шебангу
Другая альтернатива, которая может работать лучше в некоторых сценариях, - заставить скрипт запускаться в интерактивной оболочке, добавив флаг в shebang :
#!/bin/bash -i
Помните о нескольких вещах:
- Это лучше практика использовать
#!/usr/bin/env bashформу , но таким образом , вы не можете запустить оболочку с аргументами .
- Использование
-iимеет свой собственный набор последствий, среди которых программы будут запрашивать взаимодействие с пользователем, и это обычно не предназначено для сценариев, например, установка debпакетов может остановить сценарий при dpkg configureзапросах .
- Сначала я пытался использовать
set -iи set +iвключать и выключать эту функцию там, где мне было нужно, но это не работает .