In meiner Ubuntu-Installation auf Google Compute Engine gibt es mehrere Startdateien.
Gibt es einen Befehl, der mir sagt, welche Startdatei von der Shell verwendet wird, die ich aktuell verwende?
Antwort1
Die Liste der Dateien, die Shells normalerweise beim Start lesen, ist auf wenige beschränkt. Diese können jedochQuelleandere, und das können große Zahlen sein, beispielsweise wenn komplexe Vervollständigungssysteme geladen werden.
Ein Ansatz besteht darin, Ihre Shell mit folgendem auszuführen:
strace -e open your-shell
(oder der entsprechende Befehl auf Ihrem System wie truss
/ tusc
/ dtruss
...)
Dadurch werden alle Dateien aufgelistet, die die Shell öffnet. Außerdem werden die Dateien aufgelistet, die sie öffnet und die keine Startdateien sind, sowie Dateien, die sie versucht, aber nicht öffnen kann.
Ein anderer Ansatz könnte darin bestehen, den Modus einiger Shells zu verwenden xtrace
, bei dem die Shell auf stderr ausgibt, was sie für jeden Befehl tun wird. Dazu rufen Sie einfach die Shell mit der -x
Option auf.
Einige Shells wie zsh
drucken standardmäßig die Pfade der Datei, aus der der ausgeführte Code stammt (Sie können jedoch beispielsweise festlegen, PS4
dass +%x>
der Dateiname auch für in Funktionen ausgeführten Code gedruckt wird). Bei anderen, wie bash
oder ksh93
, können Sie den Ausdruck durch Ändern der $PS4
Variable veranlassen.
PS4='+$BASH_SOURCE> ' bash -x
PS4='+${sh.file}> ' ksh93 -x
PS4='+%x> ' zsh -x
Mit bash
können Sie die Ausgabe so nachbearbeiten, dass nur eindeutige Pfade der Dateien erhalten bleiben, etwa mit:
PS4=' <:>$BASH_SOURCE<:>' BASH_XTRACEFD=3 3> >(
awk -F'<:>' 'NF>2 && !seen[$2]++ {print $2}') bash -x
(vorausgesetzt, die Pfade der Startdateien enthalten keine Zeilenumbrüche oder <:>
und in den Startdateien wird kein mehrzeiliger Befehl ausgeführt, der Folgendes enthält <:>
)
Diese xtrace
auf -basierten Ansätze listen weder Startdateien auf, die leer sind oder nur aus Kommentaren oder Funktionsdefinitionen bestehen (es sei denn, diese Funktionen werden später ausgeführt), noch Startdateien, die die Shell verarbeiten würde, wenn sie da wären.
Sie können jedoch die Dateien abrufen, aus denen Funktionen definiert wurden mit
eval "(shopt -s extdebug; declare() { typeset -F \"\$2\"; }
$(typeset -F))" | cut -d ' ' -f 3- | sort -u
mit bash
oder
type ${(k)functions} | sed -n 's/.*is a shell function from //p' | sort -u
mit zsh
.