Inhaltsverzeichnis¶
- Textdateien
- Variablen / Shell Skripte Übersicht
- Spezielle Variablen
- Umgebungsvariablen
Textdateien¶
Standards zur Kodierung von Zeichen¶
ASCII-Code¶
Der ASCII-Code (American Standard Code for Information Interchange) ist ein (alter) Standard um Zeichen zu kodieren. ASCII beschreibt einen Sieben-Bit-Code. D.h. es können $2^7 = 128$ Zeichen mit ASCII-Code dargestellt werden. Steuerzeichen (wie z.B.: Zeilenvorschub) sind im ASCII-Code ebenfalls erhalten.
Beispiel: Buchstabe A : 1000001
Durch Hinzunahme des 8-ten Bit (des Bytes) können nochmal 128 Zeichen dargestellt werden. Diese können für länderspezifische Zeichen genutzt werden, wie z.B. ISO 8859-1 (Latin-1) mit deutschen Umlauten. In unterschiedlichen Ländern sind unterschiedliche Standards üblich. Dies führt zu Inkompatibilitäten zwischen den verschiedenen Ländercodierungen bzw. Computersystemen (z.B. bei deutschen Umlauten).
Unicode¶
Unicode ist ein internationaler Standard, mit dem Ziel spezielle Zeichen aller Sprachen (Schriftkulturen) zu umfassen. Unicode weist jedem Zeichen eine eindeutige Nummer (Unicode-Wert) zu. Durch standardisierte Kodierungen der Unicode-Werte, wie UTF-8, sollen die Inkompatibilitäten (falsche Darstellungen) vermieden werden.
für Interessierte¶
Für den Unterschied zwischen Unicode und Implementierungen wie UTF-8, siehe z.B. https://stackoverflow.com/questions/643694/what-is-the-difference-between-utf-8-and-unicode
Text-Dateien¶
Text-Daten können als Dateien (Files) im ASCII-Code oder UTF-8 auf einem Rechner gespeichert werden. Diese Dateien können ohne größeren Schwierigkeiten zwischen verschiedenen Computersystemen ausgetauscht werden und dort angezeigt und weiterverarbeitet werden. Dabei ist darauf zu achten, dass die Kodierung richtig erkannt bzw. eingestellt wird. Desweiteren können jedoch Probleme bei der Handhabung des Zeilenendes auftreten. Windows verwendet zur Markierung des Zeilenendes die Kombination Wagenrücklauf-Zeilenvorschub (carriage return - line feed, CRLF). Unix und Linux nutzen nur den Zeilenvorschub (line feed, LF).
Beispiele für Text-Dateien: CSV, Emails, HTML-Webseiten.
file
command¶
Das file
Kommando führt mehrere Tests durch, um den Typ einer Datei zu klassifizieren. Dabei wird auch
versucht die Kodierung von Textdateien genauer zu bestimmen. Mehr siehe man file
.
file countries.txt
echo
file ~/bin/backup.sh
countries.txt: ASCII text /home/chris/bin/backup.sh: Bourne-Again shell script, ASCII text executable
file ../regEx/regular-expression-exercise.ipynb
echo
file /home/chris/tmp/side_by_side_without_boarder_nearest.png
../regEx/regular-expression-exercise.ipynb: UTF-8 Unicode text /home/chris/tmp/side_by_side_without_boarder_nearest.png: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced
MIME¶
MIME ist ein Standard zur Deklaration von Dateiinhalten (bzw. Dateitypen), der ursprünglich für Emails entwickelt wurde, mehr hierzu z.B. in https://wiki.ubuntuusers.de/MIME-Typ/
file --mime ../regEx/regular-expression-exercise.ipynb
echo
file -i /home/chris/tmp/side_by_side_without_boarder_nearest.png
../regEx/regular-expression-exercise.ipynb: text/plain; charset=utf-8 /home/chris/tmp/side_by_side_without_boarder_nearest.png: image/png; charset=binary
Editoren¶
Übung¶
Gängige Text-Editoren für die Kommandozeile sind:
- Nano (einfach, reicht oft aus)
- Emacs
- für ein Tutorial: Starten Sie
emacs
und drücken Sie STRG&h und danach t. - Emacs kann sowohl im GUI-Mode als auch in der Kommandozeile gestartet werden. Mit der expliziten Schalter
-nw
(no window), startet emacs im Terminal(-Fenster).
- für ein Tutorial: Starten Sie
- VIM, siehe auch The Missing Semester of Your CS Education - Part Three: Editors (VIM)
Wählen Sie einen Kommandozeilen-Text-Editor aus und arbeiten Sie sich in diesen ein. Recherchieren Sie hierzu ein geeignetes Tutorial.
Prozesse¶
Ein Prozess) (aus dem Lateinischen procedere, „vorwärts gehen“) ist ein laufendes Programm. Dabei kann dasselbe Programm mehrfach quasi-parallel ausgeführt werden. Prozesse besitzen eine eindeutige Identifikationsnummer (ID), die Prozess-ID (PID).
Hinweis: Prozesse werden später ausführlicher behandelt.
Die spezielle Variable $$
beinhaltet die Prozeß-ID (PID) eines laufenden Skiptes. Ein Skript ist im einfachsten Fall eine Textdatei, die mehrere Befehle enthält. Diese werden dann der Reihe nach ausgeführt, wenn das Skript gestartet wird. Die Skript-Datei muss vor dem Start ausführbar gemacht werden (z.B. via chmod u+x myscript.sh
).
# So erhält man die PID des Bash-Prozesses der Shell
echo -e "shell:\n" '$='$$ 'BASHPID='$BASHPID
shell: $=23432 BASHPID=23432
Beachte (aus https://unix.stackexchange.com/questions/484442/how-can-i-get-the-pid-of-a-subshell)
- Variable
$$
: Expands to the process ID of the shell. In a subshell, it expands to the process ID of the current shell, not the subshell. - Variable
BASHPID
: Expands to the process ID of the current bash process. This differs from$$
under certain circumstances, such as subshells that do not require bash to be re-initialized.
#subshells
echo -e $(echo "subshell\n" '$='$$ 'BASHPID='$BASHPID)
subshell $=23432 BASHPID=4659
Wenn ein Shell-Skript ausgeführt wird, wird ein neuer Prozess gestartet. Die aufrufende Shell ist der Eltern-Prozess (parent process) und der Prozess des Shell-Skriptes der Kind-Prozess (child process).
# Auch der Shell-Prozess hat ein Parent
# So erhält man die PID des Parent, die PPID
echo $PPID
12744
Aufgabe¶
Lesen Sie 1.9 Vom Shellscript zum Prozess.
Umgebungsvariablen¶
Umgebungsvariable (Environment Variables) sind besondere Variablen, die von Prozessen für unterschiedliche Dinge verwendet werden können (Beispiele später). Umgebungsvariablen werden bei der Prozess-Erzeugung an die Kinderprozesse vererbt. Die Kinderprozesse erhalten eine Kopie der Umgebung des Elternprozesses.
Das Kommando printenv
dient dazu die gesetzen Umgebungsvariablen anzuzeigen.
printenv | grep -i python
VIRTUAL_ENV=/home/chris/python-virtal-envs/py3.8.0 PATH=/home/chris/python-virtal-envs/py3.8.0/bin:/home/chris/python-virtal-envs/py3.8.0/bin:/home/chris/.local/bin:/home/chris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Mit dem Kommando printenv
können Sie direkt die Werte von Umgebungsvariablen erhalten, z.B.
printenv VIRTUAL_ENV # zeigt nur die Variable VIRTUAL_ENV an!
echo
#die Werte von VIRTUAL_ENV sind natürlich auch per Parameter-Substitution erhältlich
echo $VIRTUAL_ENV
/home/chris/python-virtal-envs/py3.8.0 /home/chris/python-virtal-envs/py3.8.0
Man kann die Kommandozeile als Umgebung sehen, die shell-Code ausführt. Kommandos sind
dann shell build-ins oder weitere Programme, die ausgeführt werden können, d.h. in der Regel weitere Prozesse ergeben.
Diese Programme, d.h. die ausführbaren Dateien, muss die shell finden. Dazu dient die Umgebungsvariable PATH
.
So kann man sich anzeigen lassen, wo die shell nach den ausführbaren Programmen sucht:
printenv PATH
/home/chris/python-virtal-envs/py3.8.0/bin:/home/chris/python-virtal-envs/py3.8.0/bin:/home/chris/.local/bin:/home/chris/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
In der Variablen SHELL
ist die Art des Shell-Interpreters (der laufenden Shell) gespeichert:
printenv SHELL
/bin/bash
export
¶
Shell Skripte laufen in einem eigenen Prozess (erkennbar an der anderen PID).
Wenn in der aufrufenden Shell eine Variable gesetzt wird, dann ist diese
im Shell Skript nicht verfügbar (anderes als bei Subshells via $(...)
oder Pipes). Das Skript muss ja kein Bash-Skript sein und Bash-Skripte werden hier nicht besonderes behandelt.
Variablen, die mit export
gesetzt werden, sind dagegen (in den Child-Prozessen und somit auch) im Skript-Prozess gesetzt.
echo PID der aufrufenden Shell: $$
my_normal_var=10
export my_env_var=11
echo '#!/bin/bash
echo Die PID dieses Skriptes ist $$
echo Der Parent-Prozess des Skriptes hat die PID $PPID # $(ps -o ppid= $$)
echo my_normal_var ist nicht sichtbar: $my_normal_var
echo my_env_var dagegen schon: $my_env_var
' > example_script.sh
chmod u+x example_script.sh
./example_script.sh
PID der aufrufenden Shell: 12753 Die PID dieses Skriptes ist 13716 Der Parent-Prozess des Skriptes hat die PID 12753 my_normal_var ist nicht sichtbar: my_env_var dagegen schon: 11
Mit export
setzt man also Variablen, die in allen Child-Prozessen des
Parent-Prozess (hier der Shell) verfügbar sind.
Diese Variablen sind somit in der Umgebung gesetzt. Dies sieht man auch mittels:
env | grep my_env_var
my_env_var=11
Aufgabe¶
Passen Sie den Prompt (Umgebungsvaribale PS1
) nach Ihrem Geschmack an. Wie dies geht, finden Sie hier:
https://wiki.ubuntuusers.de/Bash/Prompt/
Hilfreich sind dabei auch
Konfigurationsdateien für die Shell¶
Konfigurationsdateien erlauben das Verhalten der Shell zu konfigurieren. Die wichtigsten sind
.bashrc
und .bash_profile
; siehe z.B. https://wiki.ubuntuusers.de/Bash/bashrc/
.bash_profile
wird bei login Shells (beim Start der Shell) ausgeführt..bashrc
wird bei interaktiven non-login Shells ausgeführt.
"Will man also bei einer Login-Shell etwas einmalig ausführen, ist die bash_profile
der richtige Ort. Will man, dass die Veränderungen bei jedem Start eines (pseudo-)Terminals oder einer Konsole ausgeführt werden, ist die bashrc
der richtige Ort." aus https://wiki.ubuntuusers.de/Bash/bashrc/
Wollen Sie z.B. die PATH
-Umgebungsvariable erweitern, so sollte bash_profile
die richtige Wahl sein, siehe auch https://linuxize.com/post/bashrc-vs-bash-profile/
Mehr zu Bash-Startup-Files finden Sie im gnu bash User-Manual unter dem Punkt 6.2 Bash Startup Files.
Hinweis: Die Dateien mit einem Punkt als erstes Zeichen im Namen sind sogenannte versteckte Dateien.
Diese werden standardmäßig nicht angezeigt, z.B. ist bei ls
die Option -a
nötig, um diese auch
aufzulisten.
Aufgabe¶
Den Standardeditor können Sie mit Hilfe der Umgebungsvariablen EDITOR
setzen.
Am besten setzt man dies in der Konfigurationsdatei .bashrc
.
Setzen Sie Ihren Lieblingseditor in der .bashrc
. Wie lautet die entsprechende Befehlszeile?
Beim Editor nano, z.B.:
export EDITOR=/usr/bin/nano
Aufgabe¶
Setzen Sie die Sprache der Bash (z.B. zur besseren Internetrecherche bei Fehlermeldungen etc.) auf amerikanisches Englisch. In der Datei .bashrc
müssen Sie hierzu die Variable LANG
auf en_US.UTF-8
setzen (export
nicht vergessen!).
Alias-Mechanismus¶
Mittels des Alias-Mechanismus können Sie sich Abkürzungen von Befehlen (inkl. Argumenten) erstellen.
Mit dem Befehl alias
(ohne Argumente) bekommen Sie die definierten Aliase angezeigt:
alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l='ls -CF' alias la='ls -A' alias ll='ls -alF' alias ls='ls --color=auto' alias openboard='flatpak run ch.openboard.OpenBoard'
Ein (etwas sinnloses) Beispiel für die Definition eines Aliases:
# myls ist der Alias für "ls -lrth *.txt"
alias myls_txt='ls -lrth *.txt'
# Jetzt kann der Alias verwendet werden:
myls_txt
-rw-r--r-- 1 chris chris 5 Feb 5 2021 f2.txt
-rw-r--r-- 1 chris chris 5 Feb 5 2021 f.txt
-rw-r--r-- 1 chris chris 7,8K Feb 6 2021 t.txt
-rw-r--r-- 1 chris chris 462 Mär 18 2021 ls-out.txt
-rw-r--r-- 1 chris chris 70 Apr 15 2021 rechnernamen.txt
-rw-r--r-- 1 chris chris 100 Apr 15 2021 countries_2.txt
-rw-r--r-- 1 chris chris 96 Apr 15 2021 countries_3.txt
-rw-r--r-- 1 chris chris 100 Apr 15 2021 countries_4.txt
-rw-r--r-- 1 chris chris 17K Okt 12 14:39 mylog.txt
-rw-rw-r-- 1 chris chris 23 Nov 2 14:29 countries_1.txt
lrwxrwxrwx 1 chris chris 13 Nov 3 08:21 countries_soft_link.txt -> countries.txt
-rw-rw-r-- 2 chris chris 79 Nov 3 14:54 countries.txt
-rw-rw-r-- 2 chris chris 79 Nov 3 14:54 countries_second_hard_link.txt
Typischerweise werden die Aliase in der regulären Datei ~/.bash_aliases
definiert, sodass
die Aliase dann beim Öffnen der Kommandozeile verfügbar sind.
Dazu wird typischerweise diese Aliasdatei automatisch von einem bash-Konfigurationsskript (siehe unten)
ausgeführt mittels source ~/.bash_aliases
; zum Befehl (shell buildin) source
(Abkürzung .
) siehe help source
oder help .
.
mehr zum Alias-Mechanismus siehe https://de.wikibooks.org/wiki/Linux-Praxisbuch/_Bourne_Again_Shell#Der_Alias-Mechanismus
Lernkontrollfragen¶
Folgende Fragen sollten Sie ohne Nachschlagen beantworten können:
- Was sind Textdateien? Was ist ASCII, Unicode und UTF-8?
- Was ist eine Umgebungsvariable?
- Wie findet die Shell ausführbare Dateien? Welche Umgebungsvariable wird hier verwendet?
- Wann benötigt man
export
beim Setzen von Variablen? - Wozu dienen die Dateien
.bashrc
bzw..bash_profile
? Was bedeutet der Punkt am Anfang des Dateinamens? - Was ist der Alias-Mechanismus?