Mögliches Duplikat:
So ermitteln Sie, woher eine Umgebungsvariable stammt
Ich frage mich, ob es eine Möglichkeit gibt, den Speicherort der Datei zu ermitteln, in der eine bestimmte Konfiguration vorhanden ist. Ich weiß beispielsweise, dass ich einen globalen Parameter habe TMOUT
und ihn ändern möchte, aber ich weiß nicht, WO er konfiguriert ist. Ich bin mir bewusstDasFrage, die hier bereits gestellt wurde. Ich würde jedoch gerne wissen, ob es eine andere Möglichkeit gibt, außer die Reihenfolge des Auftretens der Variablen gemäß dem env
Befehl zu untersuchen.
Antwort1
Die Ausführung dieses Befehls dauert lange (da er jede Datei im System prüft), aber er sollte die Datei finden:
find / -type f -print0 | xargs -0 grep -w 'TMOUT=' /dev/null
Ein alternativer Ansatz besteht darin, herauszufinden, unter welchen Umständen es gesetzt wird, beispielsweise indem Sie prüfen, ob es gesetzt wird, wenn die Shell keine Login-Shell ist ( env -i bash
) und ob es gesetzt ist ( env -i bash --login
). Sie können Dateien in manuell prüfen $HOME
, beispielsweise .profile
, .env
, .bashrc
oder .bash_profile
. Es gibt auch einige Dateien, in /etc/
denen Umgebungsvariablen angegeben sind; es könnte in jeder dieser Dateien gesetzt werden.
Wenn Ihre Login-Shell ist ksh
, werden Sie feststellen, dass dies $TMOUT
von der KSH-Shell selbst festgelegt wird.
Bearbeiten:um einige der weniger offensichtlichen Funktionen der obigen Befehlszeile zu erklären:
Die Redewendung find ... -print0 | xargs -0 ...
ist recht gebräuchlich. Der Sinn der Verwendung -print0
von anstelle der Standardeinstellung -print
besteht darin, dass die Dateinamen im Fall von mit einem ASCII-NUL beendet werden -print0
. Dies bedeutet, dass Dateinamen, die eine tatsächliche neue Zeile enthalten, korrekt dargestellt werden. Die Übergabe der -0
Option an xargs
macht einfach xargs
dieselbe Konvention verständlich.
Es ist auch eine Erklärung wert , wie man routinemäßig /dev/null
als erstes Argument an übergibt grep
. Da Sie nur das Dateiende erhalten, wenn Sie von lesen /dev/null
, wird es nie mit einem nicht leeren String übereinstimmen grep
. Daher wird es keine Treffer für diese Datei geben. Wir geben es nur in der grep-Befehlszeile an, um den Fall richtig zu behandeln, dass beim letzten Ausführen von xargs
grep nur noch eine Datei zu durchsuchen ist. Wenn grep nur ein Dateiargument hat, listet es die Treffer auf, ohne die Befehlszeile anzugeben. So:
~/tmp/t$ echo hello > a
~/tmp/t$ echo hi > b
~/tmp/t$ grep '^h.*' a
hello
~/tmp/t$ grep '^h.*' a b
a:hello
b:hi
Antwort2
Dies ist zwar keine genaue Antwort auf Ihre Frage, beantwortet aber möglicherweise einen Teil davon.
StackOverflow: Linux: Wo werden Umgebungsvariablen gespeichert?
BEARBEITEN:
Beim Debuggen meiner Shell-Skripte füge ich normalerweise -x hinzu. #!/bin/bash -x
Sie können es auch von der Shell aus ausführen alsbash -x
# su - test
test$ bash -x
unset a r
+ . /etc/bash_completion.d/yast2-completion.sh
**(file sourced)**
++ YAST=/sbin/yast
++ YAST_MODLIST=()
**(variables set from file)**
#....
++ /usr/bin/dircolors -b /etc/DIR_COLORS
+ eval 'LS_COLORS='\''no=00
#....