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