Я хочу доповнити відповідь Раві :
Така поведінка характерна для 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; але може бути хорошим рішенням, якщо ви розробляєте сценарії для більш-менш відомих систем.
Модніше рішення може включати використання регулярного вираження для націлювання на конкретні біти, які зупиняють оцінку.
Альтернатива Шебангу
Іншою альтернативою, яка може працювати краще в деяких сценаріях, є змушування сценарію запускатися в інтерактивній оболонці, додаючи прапор у шебанг :
#!/bin/bash -i
Будьте в курсі кількох речей:
- Це краще практика використовувати
#!/usr/bin/env bashформу , але таким чином , ви не можете запустити оболонку з аргументами .
- Використовуючи
-iсвій власний набір наслідків, серед них програми підкажуть про взаємодію користувачів, і це, як правило, не призначено для сценаріїв, наприклад, встановлення debпакетів може зупинити скрипт dpkg configureпідказки .
- Спочатку я намагався використовувати
set -iта set +iвмикати функцію там, де мені це потрібно, але це не працює .