Chcę uzupełnić odpowiedź Raviego :
To zachowanie jest specyficzne dla Ubuntu (i prawdopodobnie większości pochodnych dystrybucji), ponieważ domyślny ~/.bashrc
plik 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 source
odziedziczy tę właściwość.
eval
włamać się
Dowiedziałem się brzydkiego włamania do obejścia Ubuntu, używając eval
zamiast source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Po prostu pomija kilka pierwszych wierszy i ocenia resztę, ~/.bashrc
wię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: