Wenn ich mit xonsh Screenfetch mache, kommt Python x.x heraus und es ist traurig

$ 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 lesen

screenfetch:GitHub

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.

Gegenmaßnahmen

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

Wenn ich mit xonsh Screenfetch mache, kommt Python x.x heraus und es ist traurig
Ich habe mit PyQt5 und Python3 gespielt
Ich habe Numba mit Python3.5 installiert und verwendet
Empfohlene Umgebung und Verwendung bei der Entwicklung mit Python
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe Funktionssynthese und Curry mit Python versucht
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Ich möchte die Optimierung mit Python und CPlex behandeln
Ergebnisse bei der Beschleunigung numerischer Berechnungen mit Python und Numba
Ich habe mir die Versionen von Blender und Python angesehen
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Wenn die nicht unterstützte Architektur mit pip (Mac) herauskommt
Ich habe versucht, Co-Filtering (Empfehlung) mit Redis und Python zu implementieren
Ich war überrascht, eine nette Rezension zu erhalten, als ich Python an CheckIO und seine Erklärung schrieb
Als ich CaboCha in Python3 verfügbar machte, blieb ich stecken (Windows 10)
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Diesmal habe ich mit Prorate Python III und IV gelernt
Ich habe fp-Wachstum mit Python versucht
Programmieren mit Python und Tkinter
Ich habe versucht, mit Python zu kratzen
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Ich habe einen Blackjack mit Python gemacht!
# 2 [python3] Trennung und Kommentar aus
Ich habe Java und Python verglichen!
Fehler beim Spielen mit Python
Python mit Pyenv und Venv
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Funktioniert mit Python und R.
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe Maki Horikita und Kanna Hashimoto hinzugefügt und durch 2 durch Python geteilt
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
[Python] Fehler- und Lösungsnotiz bei Verwendung von venv mit pyenv + anaconda
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
Wirf etwas mit Python in Kinesis und stelle sicher, dass es drin ist
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen