In my verwende .profile
ich den folgenden Code, um sicherzustellen, dass Bash-bezogene Aliase und Funktionen nur bezogen werden, wenn die Anmeldeshell tatsächlich Bash ist :
# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
# source ~/.bashrc if it exists.
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Ich bin gerade dabei, meine Shell-Konfigurationsdateien, Skripte und Funktionen der Versionskontrolle zu unterstellen. Ich habe vor kurzem auch damit begonnen, gelegentliche Bashisms aus Shell-Skripten zu entfernen, die nicht von Bash-spezifischen Funktionen profitieren, z . B. Ersetzen function funcname()
durch funcname()
.
Für mein Shell-Datei-Repository habe ich einen Pre-Commit- Hook konfiguriert , der das checkbashisms
Dienstprogramm aus Debians devscripts-Paket für jede sh
Datei im Repository ausführt, um sicherzustellen, dass ich nicht versehentlich die Bash-spezifische Syntax einführe. Dies führt jedoch zu einem Fehler für meine .profile
:
possible bashism in .profile line 51 ($BASH_SOMETHING):
if [ "${BASH_VERSION:-}" ]; then
Ich habe mich gefragt, ob es eine Möglichkeit gibt, zu überprüfen, welche Shell ausgeführt wird, die keine Warnung auslöst checkbashisms
.
Ich habe die Liste der von POSIX aufgelisteten Shell-bezogenen Variablen überprüft, in der Hoffnung, dass eine davon verwendet werden kann, um die aktuelle Shell anzuzeigen. Ich habe mir auch die Variablen in einer interaktiven Dash-Shell angesehen, aber auch hier keinen geeigneten Kandidaten gefunden.
Im Moment habe ich ausgeschlossen, .profile
von verarbeitet zu werden checkbashisms
; Da es sich um eine kleine Datei handelt, ist es nicht schwierig, sie manuell zu überprüfen. Nachdem ich das Problem untersucht habe, möchte ich dennoch wissen, ob es eine POSIX-kompatible Methode gibt, mit der ermittelt werden kann, welche Shell ausgeführt wird (oder zumindest eine Methode, die nicht checkbashisms
zum Fehlschlagen führt).
Weiterer Hintergrund / Klarstellung
Einer der Gründe, warum ich meine Shell-Konfigurationsdateien der Versionskontrolle unterstelle, ist die regelmäßige Konfiguration meiner Umgebung auf allen Systemen, auf denen ich mich derzeit anmelde: Cygwin, Ubuntu und CentOS (beide 5 und 7, mit Active Directory für Benutzer) Authentifizierung). Ich melde mich am häufigsten über X Windows / Desktop-Umgebungen und SSH für Remote-Hosts an. Ich möchte jedoch, dass dies zukunftssicher ist und möglichst wenig von Systemabhängigkeiten und anderen Tools abhängt.
Ich habe checkbashisms
als einfache, automatisierte Überprüfung die Syntax meiner Shell-bezogenen Dateien verwendet. Es ist kein perfektes Tool, z. B. habe ich bereits einen Patch darauf angewendet, damit er sich nicht über die Verwendung command -v
in meinen Skripten beschwert . Während der Recherche habe ich erfahren, dass der eigentliche Zweck des Programms darin besteht, die Einhaltung der Debian-Richtlinien sicherzustellen, die meines Wissens eher auf POSIX 2004 als auf 2008 (oder dessen Revision 2013) basieren.
.bash_profile
, das sowohl .profile
(bedingt) als auch Quellen enthält .bashrc
.