Im Reich der Schalentiere - die Welt der Linux-Kommandozeile

16.3.2019

Holger Trapp

base64 -d <<<aG9sZ2VyLnRyYXBwQGhyei50dS1jaGVtbml0ei5kZQo=

Unix-Grobstruktur

Unix-Grobstruktur

Unix-Philosophie

nach Doug McIlroy (in Peter H. Salus, A Quarter Century of Unix):

Unix-Werkzeugkasten

Shell

Warum Kommandozeile?

Warum Kommandozeile?

Warum Kommandozeile?

Wo finden wir die Shell?

Was kann man aus der Shell starten?

Wie läuft das prinzipiell ab?

Start von GUI-Programmen

firefox       # Browser Firefox
firefox -h    # Hilfetext zum Kommando firefox ausgeben lassen
firefox -ProfileManager
              # Firefox mit dem Profile Manager starten
firefox -CreateProfile default
              # Firefox-Profil erzeugen

thunderbird   # Mailer Thunderbird

eog *.jpg     # Bildbetrachter "Eye of GNOME" für .jpg-Dateien
mplayer *.mp3 # Movie Player für .mp3-Dateien
ooffice *.xls # LibreOffice für .xls-Dateien

Start von Full-Screen-Programmen

vim    # Text-Editor Vim
nano   # Text-Editor nano
alpine # Mailer Alpine
mc     # Midnight Commander - Dateimanager/visuelle Shell
less x # Pager less für Datei x

# Web-Browser w3m / lynx / links
w3m www.tu-chemnitz.de
links https://chemnitzer.linux-tage.de/2019/de/programm/vortraege

Aufruf von Kommandozeilen-Tools

hostname    # den Hostnamen ausgeben
date        # Datum/Uhrzeit ausgeben
cal         # Kalender des aktuellen Monats ausgeben
cal -s 2015 # Kalender von 2015 mit Sonntag als erstem Tag
cal -y      # Kalender des aktuellen Jahres
 
# alle .JPG-Dateien des aktuellen Verzeichnisses
# auf 256x256 vergrößern/verkleinern
mogrify -resize 256x256 *.JPG

# Grafik mit Copyright-Vermerk versehen
# siehe auch: Bildbearbeitung mit ImageMagick und Exiftool
convert -gravity SouthEast -pointsize 70 -fill blue \
-draw "text 60,20 '© Mikis'" mikis.jpg mikis_c.jpg

Bedienkomfort

Bedienkomfort

Skripting

Skripting

Skripting

#!/bin/sh
#
# endlos die Dateien aller Unterverzeichnisse des aktuellen
# Verzeichnisses mit mplayer abspielen, deren Name 
# "Oronte", "oronte", "Monti" oder "monti" enthält
shopt -s extglob
while true
do
  for i in */*@([Oo]ronte|[Mm]onti)*
  do
    mplayer "$i"
  done
done

Einfache Kommandos

Einfache Kommandos

# Kalenderprogramm mit diversen Argumenten/Optionen rufen
cal 3 2010
cal -3 3 2010
LC_ALL=C cal -y -s # LC_ALL=C bewirkt englische Ausgabe
cal -m 3 2010

# Einträge des Wurzelverzeichnisses / im langen Format auflisten
ls -ld /

E/A-Umlenkungen

# Umwandlung von Klein- in Großbuchstaben mit tr
tr a-z A-Z < /etc/hosts
tr a-z A-Z < /etc/hosts > /tmp/result
tr a-z A-Z < /etc/hosts >> /tmp/result
set -o noclobber
tr a-z A-Z < /etc/hosts >| /tmp/result

# String-Suche mit fgrep
fgrep localhost /etc/hosts /xyz
fgrep localhost /etc/hosts /xyz > /dev/null
fgrep localhost /etc/hosts /xyz 2> /dev/null
fgrep localhost /etc/hosts /xyz 2> /tmp/err > /tmp/out
fgrep localhost /etc/hosts /xyz &> /tmp/out_err

# SSH Version String lesen: zuerst mit eingebautem
# Bash-Kommandos, dann mit externem Kommando
read < /dev/tcp/login.tu-chemnitz.de/22 ; echo $REPLY
sed 1q < /dev/tcp/login.tu-chemnitz.de/22

E/A-Umlenkungen

# Hier-Dokumente
# - streicht Tabs am Zeilenanfang
cat <<-!
  Hier-Dokument mit Substitutionen
  $PWD $(date)
!

cat <<-\!
  Hier-Dokument ohne Substitutionen
  $PWD $(date)
!

# Hier-Strings
cat <<< "Ich bin ein Hier-String: $PWD $(date)"

Kommandotypen und Ausführungs-Reihenfolge

1.Alias alias ..='cd ..'
2.reserviertes Wort if, while, ...
3.Shell-Funktion function ls { /bin/ls --color=tty "$@"; }
4.eingebautes Kommandocd
5.externes Kommando uptime

Shell-Variable PATH enthält den Suchpfad

Typbestimmung mit type, z.B.

type cd

Expandierungen

Expandierungen

Expandierungen

Expandierungen

Quotierung zur Aufhebung der Sonderbedeutung von Zeichen

# \  ==> quotiert das Folgezeichen
# '' ==> starke Quotierung von Zeichenfolgen
# "" ==> schwache Quotierung von Zeichenfolgen

echo /b\* \$PWD
echo '/b* $PWD $(date) `whoami` \$ \a \"'
echo "/b* $PWD $(date) `whoami` \$ \a \""

Pipes

# Syntax: [time [-p]] [ ! ] Kommando [ | Kommando2 ... ]
fgrep Otto /etc/passwd | wc -l
! fgrep Otto /etc/passwd | wc -l
fgrep Otto /etc/passwd | tee /tmp/datei | wc -l
fgrep Otto /etc/passwd | fgrep Normal | wc -l
fgrep Otto /etc/passwd | fgrep Normal | cut -d: -f1
fgrep Otto /etc/passwd | fgrep Normal | awk -F: '{print $1}'
fgrep Otto /etc/passwd | fgrep Normal | sed 's/:.*//'

fgrep localhost /xyz 2>&1 | wc -l
# ab Bash 4: |&
fgrep localhost /xyz |& wc -l

time sleep 1
time md5sum /usr/bin/mplayer /boot/vmlin* | tr a-z A-Z
# mit negiertem Exit Code (1 statt 0 bei Erfolg)
time ! sha1sum /usr/bin/mplayer | tr a-z A-Z

Listen und Hintergrundkommandos

date ; uptime

cd /tmp && touch myfile
mv datei1 datei2 && mv datei3 datei1
head datei?

fgrep -q abc datei || echo nicht gefunden

mv -i datei datei.xx ; ln -s datei.xx datei
  
eog *jpg &

eog *jpg
Ctrl-Z
bg

Zusammengesetzte Kommandos

[[ -r datei && -s datei ]] && sort datei

if [[ -z $MAX ]]
then
  echo kein MAX
else
  echo $MAX
fi

read -p 'Antwort (j/n): ' antwort
case "$antwort" in
  j|J) echo Ja ;;
  n|N) echo Nein ;;
  *) echo ungültige Auswahl ;;
esac

Zusammengesetzte Kommandos

while true
do
  echo ===
  sleep 1
done

zahl=5
until ((! zahl))
do
  echo $((zahl--))
done

Zusammengesetzte Kommandos

for i in a b c
do
  echo $i
done

for (( i=1 ; i < 10 ; i++ ))
do
  echo $i
done

(cd /tmp && touch daten) ; pwd
{ cd /tmp ; touch daten ; } ; pwd

{ echo eins ; echo zwei ; } > datei

Navigation im Datei-Baum

pwd     # print working/current directory

cd      # change current directory (zu $HOME)
cd ..
cd -    # wechselt zu $OLDPWD
cd /etc

ls      # list directory contents
ls -latr

# Nutzung des Directory-Stacks
pushd /tmp
popd

Verzeichnisse und Dateien

# Anlegen
mkdir verzeichnis
touch datei
vim datei
echo text > datei

# Löschen
rmdir verzeichnis
rm datei
rm -rf *.bak verzeichnis*

# Verschieben und Umbenennen
mv datei1 datei2
mv datei verzeichnis

Vergleichen von Dateien

diff datei1 datei2
diff -ru dir1 dir2 | vim -

vimdiff datei1 datei2

vim datei # datei.bak beim Speichern angelegt
diff -u datei.bak datei

Suchen

# Suche im Datei-Baum nach Namen, Inhalten u.a. Kriterien
fgrep abc datei
grep '^a.*f$' datei
egrep 'max|moritz' datei

# rekursive Suche
fgrep -rl Getriebe .
grep -rl 'aa.*bb' ~/Dokumente
egrep -rl 'EDV|IT' $HOME/Dokumente

find
find /tmp -type f | xargs fgrep -L function
find /tmp -type f -print0 | xargs -0 fgrep -L function

# Dubletten aufspüren
find . -type f -print0 | xargs -0 md5sum | sort | uniq -D -w 32

# Suche in regelmäßig aktualisierter Datenbasis von Dateinamen
locate vmlinuz

Harte und symbolische Links

# Datei bei Bedarf anlegen
touch 20130106_log.txt

# symbolischen Link erzeugen
ln -s 20130106_log.txt aktuell

# harten Link (hard link) generieren
ln 20130106_log.txt current

# Kontrolle durch langes Listing mit Inode-Nummer
ls -li aktuell current 20130106_log.txt

Anzeige und Modifikation

# Daten von stdin in datei kopieren
cat > datei
1 a
2 b
3 c
Ctrl-D

# Inhalt von datei nach stdout kopieren
cat datei

# Inhalt mehrerer Dateien konkatenieren
cat datei{1..3}

# das erste Leerzeichen jeder Zeile durch | ersetzen
sed -i 's/ /|/' datei

Anzeige und Modifikation

# Inhalt von /etc/hosts ab Zeile 4 anzeigen
sed 1,3d /etc/hosts
awk 'NR > 3' /etc/hosts
tail -n +4 /etc/hosts

# nach der ersten Spalte numerisch absteigend sortieren
sort -t\| -k1,1nr -o datei datei

# Spalte 1 summieren und Summe ausgeben
awk -F\| '{ sum += $1 } END { print sum }' datei

# Spalte 2 gefolgt von // gefolgt von Spalte 1 ausgeben
awk -F\| '{ print $2 "//" $1}' datei > datei.new &&
  mv datei datei.old &&
  mv datei.new datei

Prozess-Management

# ps - process status
ps
ps auxww | grep bash

pstree -p  # display a tree of processes

top        # display Linux processes

lsof datei # list open files

# PID 100 mit SIGTERM beenden (sofern möglich)
kill 100
# alle Prozesse von otto hart mit SIGKILL beenden
killall -9 -u otto

Dateisysteme

# disk free
# Anzeige des Füllstandes montierter Dateisystem
df

# disk usage
# Anzeige des benutzten Platzes im Dateisystem
du
du -s * | sort -k1,1n  # Speicherplatzfresser aufspüren

# list block devices
# Anzeige der Blockgeräte
lsblk

# Dateisysteme montieren/demontieren
mount        # Anzeige montierter Dateisysteme
umount /mnt  # /mnt aushängen

entfernte Rechnernutzung und Dateitransfer

# interaktives Login auf server
ssh server

# Kommandoausführung auf Server
ssh server w
zcat datei.gz | ssh server 'cat > /tmp/datei'

# Dateien zwischen Systemen kopieren
scp rechner:rem_datei lok_datei
 
# wget - non-interactive network downloader
wget ftp://ftp.vim.org/pub/WhereToFindWhat.txt
wget https://www.tu-chemnitz.de

Konfiguration der Bash über ~/.bashrc und ~/.inputrc

# Shell-Optionen setzen/zurücksetzen;
# kann jederzeit in der aktuellen Shell erfolgen
shopt -s cmdhist
shopt -s lithist
shopt -u cdspell
set -o noclobber

# Abfrage
shopt
shopt -o
set -o
set +o

Konfiguration der Bash ...

# typischerweise in ~/.bashrc definiert

# Shell- und Umgebungsvariablen setzen
HISTSIZE=1000
export EDITOR=vim

# Prompt einstellen
PS1='\[\e]2;\h:\w\a\e[7m\]\u@\h\[\e[0m\] \! $> '

# Aliase und Shellfunktionen definieren
alias ..='cd ..'
alias crypt='encfs ~/.crypt ~/crypt'

unalias ls 2>/dev/null
function ls
{
  #LC_ALL=C \
  /bin/ls --color=never "$@"
}

# Shell-Funktion ls später wieder löschen
unset -f ls    # -f kann entfallen, wenn es keine Variable ls gibt

/

#