Я хочу дополнить ответ Рави :
Такое поведение характерно для 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
включать и выключать эту функцию там, где мне было нужно, но это не работает .