Chcę uzupełnić odpowiedź Raviego :
To zachowanie jest specyficzne dla Ubuntu (i prawdopodobnie większości pochodnych dystrybucji), ponieważ domyślny ~/.bashrcplik zaczyna się od zwarcia, Ubuntu 18.04, na przykład:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Spowoduje to zatrzymanie oceny pliku, jeśli jest on uruchomiony w nieinteraktywnej powłoce, co ma miejsce w przypadku skryptu, ponieważ wszystkie skrypty są uruchamiane w nieinteraktywnej powłoce , a następnie każdy plik sourceodziedziczy tę właściwość.
eval włamać się
Dowiedziałem się brzydkiego włamania do obejścia Ubuntu, używając evalzamiast source:
eval "$(cat ~/.bashrc | tail -n +10)"
Po prostu pomija kilka pierwszych wierszy i ocenia resztę, ~/.bashrcwięc reszta jest oceniana i modyfikuje bieżące wykonanie.
Pamiętaj, że jest to magiczna liczba i może nie działać w różnych wersjach Ubuntu; ale może być dobrym rozwiązaniem, jeśli tworzysz skrypty dla mniej lub bardziej znanych systemów.
Bardziej wymyślne rozwiązanie może obejmować użycie wyrażenia regularnego do kierowania na określone bity, które zatrzymują ocenę.
Alternatywa Shebang
Inną alternatywą, która może działać lepiej w niektórych scenariuszach, jest zmuszanie skryptu do działania w interaktywnej powłoce poprzez dodanie flagi w shebang :
#!/bin/bash -i
Pamiętaj o kilku rzeczach: