$ screenfetch
/:-------------:\ user@host
:-------------------:: OS: Fedora 30 Thirty
:-----------/shhOHbmp---:\ Kernel: x86_64 Linux 5.3.16-200.fc30.x86_64
/-----------omMMMNNNMMD ---: Uptime: 13h 27m
:-----------sMMMMNMNMP. ---: Packages: 2531
:-----------:MMMdP------- ---\ Shell: python3.8
,------------:MMMd-------- ---: Resolution: 1920x1080
:------------:MMMd------- .---: DE: GNOME
:---- oNMMMMMMMMMNho .----: WM: GNOME Shell
:-- .+shhhMMMmhhy++ .------/ WM Theme: Adwaita
:- -------:MMMd--------------: GTK Theme: Adwaita [GTK2/3]
:- --------/MMMd-------------; Icon Theme: Adwaita
:- ------/hMMMy------------: Font: Cantarell 11
:-- :dMNdhhdNMMNo------------; CPU: Intel Core i7-8550U @ 8x 4GHz
:---:sdNMMMMNds:------------: GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2)
:------:://:-------------:: RAM: 6817MiB / 15779MiB
:---------------------://
Shell: Wie Sie sehen können, ist es ein bisschen traurig. Wie nimmt Screenfetch überhaupt eine Shell? Ich dachte, also las ich es. Wenn möglich, zeigen Sie bitte Xonsh an.
screenfetch ist ein Shell-Skript ... beängstigend Anscheinend ist Screenfetch-Dev wie der Hauptteil.
Also, ich möchte die Shell-Beziehung kennen, also Strg + F mit Shell.
Dann ist detectshell ()
in der 1843. Zeile aufgrund des gelben Zustands verdächtig.
Lass es uns vorerst lesen
Die erste Hälfte wird vorerst gezeigt.
detectshell () {
if [[ ! "${shell_type}" ]]; then
if [[ "${distro}" == "Cygwin" || "${distro}" == "Msys" || "${distro}" == "Haiku" || "${distro}" == "Alpine Linux" ||
"${distro}" == "Mac OS X" || "${distro}" == "TinyCore" || "${distro}" == "Raspbian" || "${OSTYPE}" == "gnu" ]]; then
shell_type=$(echo "$SHELL" | awk -F'/' '{print $NF}')
elif readlink -f "$SHELL" 2>&1 | grep -q -i 'busybox'; then
shell_type="BusyBox"
else
if [[ "${OSTYPE}" =~ "linux" ]]; then
shell_type=$(tr '\0' '\n' </proc/$PPID/cmdline | head -1)
elif [[ "${distro}" =~ "BSD" ]]; then
shell_type=$(ps -p $PPID -o command | tail -1)
else
shell_type=$(ps -p "$(ps -p $PPID | awk '$1 !~ /PID/ {print $1}')" | awk 'FNR>1 {print $1}')
fi
shell_type=${shell_type/-}
shell_type=${shell_type//*\/}
fi
fi
.....
myShell=${shell_type}
verboseOut "Finding current shell...found as '$myShell'"
}
Wenn Sie es mit der Option "-v" betrachten, können Sie sehen, dass sich die Zeile "verboseOut" Aktuelle Shell finden ... gefunden als "$ myShell" "" bewegt.
Schauen wir uns zuerst das erste if an.
$ shell_type ist wie eine Variable shell_type (wie Shinjiro Koizumi).
Zunächst scheint es, nachdem man sich den Typ des Betriebssystems angesehen hat, dass die Shell gemäß dem Betriebssystem erworben wurde.
Da der Betriebssystemtyp Linux ist, sehen wir uns den Block von "if [[" $ {OSTYPE} "= ~" linux "]] an. Übrigens scheint = ~
ein Vergleich mit regulären Ausdrücken zu sein. Ich wusste es einfach.
Wie Sie sehen können, ist tr '\ 0' '\ n' </ proc / $ PPID / cmdline | head -1
der Shell-Typ. Ich verarbeite es etwas hinterher, aber es ist später.
/ proc / $ PPPID / cmdline
ist der Befehl des Prozesses von $ PPPID, wie Sie anhand des Namens erraten können. Ich weiß nicht, was pid $ PPPID
ist, aber es ist wahrscheinlich eine Shell. Wird es nicht mit einem anderen Code aufgenommen? Lass uns einen Blick darauf werfen.
$ ps
PID TTY TIME CMD
20316 pts/5 00:00:01 xonsh
21745 pts/5 00:00:00 ps
$ cat /proc/20316/cmdline
/home/tia/.pyenv/versions/3.8.1/bin/python3.8-u/home/tia/.pyenv/versions/3.8.1/bin/xonsh--login
Ja. Gut wie erwartet. Ich dachte, aber etwas ist seltsam. python3.8-u ??? Ich dachte das, aber ich schaute auf die rechte Seite. Da ist kein Platz. Warum. was auch immer.
xonsh startet die xonsh-Binärdatei nicht direkt, sondern Python. Nein, das stimmt. Es ist natürlich.
Aber irgendwie habe ich die Ursache verstanden. Da screenfetch den Befehl zum Starten der Shell erhält und den Namen der Shell abruft, wird xonsh, das Python anstelle der Shell direkt startet, als Python anstelle von xonsh angesehen.
Werfen wir einen Blick auf den Befehl tr und den Befehl head. Weil ich es nicht weiß.
... gg Zeit ...
tr
ist das Ersetzen von Zeichen. str.replace ()
. echo hoge | tr'hoge''fuga'
bedeutet` 'hoge'.replace (' hoge ',' fuga ')'. In Python
head
ruft die angegebene Zeile ab. str.splitlines (False) [n]
. "echo" hoge \ nfuga "| head -1" bedeutet "hoge \ nfuga" .plitlines (False) [0] ".
Der Inhalt von cmdline lautet also "tr" \ 0 '' \ n'`. Nun, als ich dachte, dass das Leerzeichen fehlt, kann es sein, dass es anstelle des Leerzeichens "\ 0" gibt. Weißt du, ob du es tatsächlich getroffen hast?
$ tr '\0' '\n' < /proc/20316/cmdline
/home/tia/.pyenv/versions/3.8.1/bin/python3.8
-u
/home/tia/.pyenv/versions/3.8.1/bin/xonsh
--login
In Ordnung. Vielleicht ist es so. Die Linie bricht richtig.
Und da es "Kopf -1" ist, wird die erste Zeile herausgenommen. Das heißt, / home / tia / .pyenv / version / 3.8.1 / bin / python3.8
.
Es ist genau das.
Und schlussendlich
shell_type=${shell_type/-}
shell_type=${shell_type//*\/}
.. Vielleicht nehme ich ganz rechts von / heraus.
Jetzt kennen Sie den shell_type.
Nun, die zweite Hälfte.
detectshell () {
......
case $shell_type in
bash)
shell_version_data=$( detectshell_ver "$shell_type" "^GNU.bash,.version" "4" )
;;
BusyBox)
shell_version_data=$( busybox | head -n1 | cut -d ' ' -f2 )
;;
csh)
shell_version_data=$( detectshell_ver "$shell_type" "$shell_type" "3" )
;;
dash)
shell_version_data=$( detectshell_ver "$shell_type" "$shell_type" "3" )
;;
ksh)
shell_version_data=$( detectshell_ver "$shell_type" "version" "5" )
;;
tcsh)
shell_version_data=$( detectshell_ver "$shell_type" "^tcsh" "2" )
;;
zsh)
shell_version_data=$( detectshell_ver "$shell_type" "^zsh" "2" )
;;
fish)
shell_version_data=$( fish --version | awk '{print $3}' )
;;
esac
if [[ -n $shell_version_data ]];then
shell_type="$shell_type $shell_version_data"
fi
myShell=${shell_type}
verboseOut "Finding current shell...found as '$myShell'"
}
Dies wird ... völlig ignoriert. Wenn $ shell_type
eine von bash, BusyBox, csh, dash, ksh, tcsh, zsh, fish
ist, scheint es die Version zu lesen. Ignorieren Ignorieren.
Nun ist die Schlussfolgerung gezogen.
Da xonsh bash
nicht direkt wie bash aufruft, sondern auf python xonsh
und python läuft, wird der direkt als pytohn bezeichnete Shell als Shell erkannt. das ist alles.
Werfen wir einen Blick auf die erste Zeile von "detectshell ()".
detectshell () {
if [[ ! "${shell_type}" ]]; then
...
Ja, schauen Sie zuerst nach, ob $ shell_type
bereits gesetzt ist. Mit anderen Worten als Gegenmaßnahme
$ $shell_type = $(xonsh -V).strip()
$ screenfetch
das ist alles!
/:-------------:\ user@host
:-------------------:: OS: Fedora 30 Thirty
:-----------/shhOHbmp---:\ Kernel: x86_64 Linux 5.3.16-200.fc30.x86_64
/-----------omMMMNNNMMD ---: Uptime: 14h 28m
:-----------sMMMMNMNMP. ---: Packages: 2531
:-----------:MMMdP------- ---\ Shell: xonsh/0.9.13.dev1
,------------:MMMd-------- ---: Resolution: 1920x1080
:------------:MMMd------- .---: DE: GNOME
:---- oNMMMMMMMMMNho .----: WM: GNOME Shell
:-- .+shhhMMMmhhy++ .------/ WM Theme: Adwaita
:- -------:MMMd--------------: GTK Theme: Adwaita [GTK2/3]
:- --------/MMMd-------------; Icon Theme: Adwaita
:- ------/hMMMy------------: Font: Cantarell 11
:-- :dMNdhhdNMMNo------------; CPU: Intel Core i7-8550U @ 8x 4GHz
:---:sdNMMMMNds:------------: GPU: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2)
:------:://:-------------:: RAM: 6954MiB / 15779MiB
:---------------------://
Recommended Posts