Voglio integrare la risposta di ravi :
Questo comportamento è specifico di Ubuntu (e probabilmente la maggior parte delle distro derivate), poiché il tuo ~/.bashrc
file predefinito inizia con un corto circuito, Ubuntu 18.04, ad esempio:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Ciò interromperà la valutazione del file se è in esecuzione in una shell non interattiva, come nel caso dello script poiché tutti gli script vengono eseguiti in una shell non interattiva e, successivamente, ogni file source
erediterà questa proprietà.
eval
mod
Ho scoperto un brutto trucco per aggirare Ubuntu in particolare, usando eval
invece di source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Salta semplicemente le poche prime righe e valuta il resto, ~/.bashrc
quindi il resto viene valutato e modifica l'esecuzione corrente.
Tieni presente che è un numero magico e potrebbe non funzionare tra le versioni di Ubuntu; ma può essere una buona soluzione se stai creando script per sistemi più o meno conosciuti.
Una soluzione più elaborata potrebbe comportare l'utilizzo di regex per indirizzare i bit specifici che interrompono la valutazione.
Alternativa Shebang
Un'altra alternativa che potrebbe funzionare meglio in alcuni scenari è forzare l'esecuzione dello script in una shell interattiva aggiungendo un flag nello shebang :
#!/bin/bash -i
Sii consapevole di alcune cose:
- Si tratta di una pratica migliore per utilizzare la
#!/usr/bin/env bash
forma, ma in questo modo si non può avviare la shell con argomenti .
- L'uso di
-i
ha il proprio set di conseguenze, tra cui i programmi richiederanno l'interazione dell'utente e questo di solito non è destinato agli script, ad esempio l'installazione di deb
pacchetti potrebbe interrompere lo script quando dpkg configure
richiesto .
- Inizialmente ho provato a utilizzare
set -i
e set +i
ad attivare e disattivare la funzionalità dove ne avevo bisogno, ma non funziona .