Ich möchte Ravis Antwort ergänzen :
Dieses Verhalten ist spezifisch für Ubuntu (und wahrscheinlich die meisten abgeleiteten Distributionen), da Ihre Standarddatei ~/.bashrc
mit einem Kurzschluss beginnt, beispielsweise Ubuntu 18.04:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Dadurch wird die Auswertung der Datei gestoppt, wenn sie in einer nicht interaktiven Shell ausgeführt wird, wie dies bei Ihrem Skript der Fall ist, da alle Skripts in einer nicht interaktiven Shell ausgeführt werden , und anschließend jede Datei, die Sie source
diese Eigenschaft erben.
eval
hacken
Ich habe einen hässlichen Hack gefunden, um Ubuntu speziell zu umgehen, indem ich eval
anstelle von source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Es überspringt einfach die wenigen ersten Zeilen und wertet den Rest aus, ~/.bashrc
so dass der Rest ausgewertet wird und die aktuelle Ausführung ändert.
Beachten Sie, dass es sich um eine magische Zahl handelt und möglicherweise nicht für alle Ubuntu-Versionen funktioniert. Dies kann jedoch eine gute Lösung sein, wenn Sie Skripte für mehr oder weniger bekannte Systeme erstellen.
Eine schickere Lösung könnte darin bestehen, Regex zu verwenden, um auf die spezifischen Bits abzuzielen, die die Auswertung stoppen.
Shebang Alternative
Eine andere Alternative, die in einigen Szenarien möglicherweise besser funktioniert, besteht darin, das Skript zur Ausführung in einer interaktiven Shell zu zwingen, indem im shebang ein Flag hinzugefügt wird :
#!/bin/bash -i
Seien Sie sich einiger Dinge bewusst:
- Es ist besser , das
#!/usr/bin/env bash
Formular zu verwenden, aber auf diese Weise können Sie die Shell nicht mit Argumenten starten .
- Das Verwenden von
-i
hat seine eigenen Konsequenzen, unter anderem werden Programme zur Benutzerinteraktion aufgefordert, und dies ist normalerweise nicht für Skripte gedacht. Wenn Sie beispielsweise deb
Pakete installieren , wird das Skript möglicherweise bei Eingabeaufforderungen dpkg configure
angehalten .
- Ich habe anfangs versucht, die Funktion dort zu verwenden
set -i
und set +i
zu deaktivieren, wo ich sie brauchte, aber das funktioniert nicht .