diff --git a/kiss/shell/whyshell.org b/kiss/shell/whyshell.org index b02dd9c761e5046f0fbd6f5b95cf0cb5f8a32f93..b68741171ea1aa2d975a2a4f2cb244b0950cd2a2 100644 --- a/kiss/shell/whyshell.org +++ b/kiss/shell/whyshell.org @@ -1,5 +1,5 @@ #+TITLE: Arbeiten auf der Commandozeile -#+AUTHOR: Björn & Milan +#+AUTHOR: Björn, Milan & Co. #+DATE: 2012-10-18 Thu #+STARTUP: beamer #+LaTeX_CLASS: beamer @@ -13,35 +13,135 @@ - Bedienung eines Rechners, ggfs. nichtgrafisch ueber ssh ("Server"). - Szenario: Man will auf einem Server den von allen Nutzern verwendeten Speicherplatz zusammenrechnen und das ganze als Textdatei abspeichern. -- du -s * | sort -nr > $HOME/user_space_report.txt +#+begin_src bash +du -s * | sort -nr > $HOME/user_space_report.txt +#+end_src ** Warum eine GUI Umgebung nicht ausreicht - GUIs sind nuetzlich und sinnvoll fuer viele verschiedene Anwendungsgebiete und Aufgaben. -- Symbolischer zugriff auf vorgefertigte Ablaeufe per Icon und Mausclick sind zwar bequem, aber unflexibel und koennen zu ungeniessbaren Workflows fuehren. +- Symbolischer zugriff auf vorgefertigte Ablaeufe per Icon und Mausclick + sind zwar bequem, aber unflexibel und koennen zu ungeniessbaren + Workflows fuehren. - RSI (Tennisarm) durch Mausschubsen. - Repetetives stupides Arbeiten im GUI; Beispielaufgabe: Finde alle Textdateien in einer mehrfach verschachtelten Verzeichnisstruktur die eine gewisse Zeichenkette beinhalten und ersetze diese Zeichenkette durch eine andere. -> Typischer Fall fuer ein Script. - GUIs und Desktopumgebungen aendern sich sehr oft und sind alles andere als uniform. ** Die Vorteile der Commandozeile - Einmal ausgefuehrtes bleibt in der History (C-r fuer Rueckwaertssuche) -- Man kann in einer Sprache (Syntax & Semantik) mit dem Computer "reden" und ihm sehr praezise mitteilen was man will und ist nicht auf eine "Babysprache" beschraenkt. +- Man kann in einer Sprache (Syntax & Semantik) interaktiv mit dem Computer "reden" und ihm sehr praezise mitteilen was man will und ist nicht auf eine "Babysprache" beschraenkt. +- Scriptbarkeit "fuer spaeter" -* Rudimentaere Grundlagen -** Navigation + +* Grundlagen +** Ein paar oft benutzte Kommandos (1) - pwd - ls - cd +- mv +- cp +- rm +- mkdir - which - cat - less +- tar - man / info - bash -- $PATH +- env +- chmod / chown + +** Ein paar oft benutzte Kommandos (2) +- top +- grep +- locate +- find +- cat +- echo +- alias +- free +- ps +- df +- fg +- jobs +- kill +- nohup +- su / sudo + +** Verzeichnisstruktur +- Hierarchie(!) Wurzel "/" ist "ganz oben" im Dateisystem (und nicht "My Computer" oder "Arbeitsplatz"). +- "/home/$USER" bzw "~" ist das Zuhause fuer persoenliche Nutzerdateien und Einstellungen (dotfiles) +- "." ist immer das aktuelle Verzeichnis, ".." bedeutet "eine Ebene hoeher" +- Andere Verzeichnisse unter / beinhalten z.b. Systemweite Einstellungen, geteilte Dateien, Dokumentationen, Quellcodes, Binaerdateien (Pedant zu .exe unter Windows). +- Verzeichnisse, Geraete und anderes Dinge koennen beliebig in die Hierarchie eingebunden werden (mount). +- Umbenennen und Verschieben ist ein und dasselbe (denn nur der inode-eintrag im Dateisystem geaendert wird)! +- Symbolische und "Harte" Verlinkung ist moeglich mit "ln". ** Ein paar Dinge zu Dateinamen - Ein mit einem Punkt "." beginnender Dateiname steht fuer eine "versteckte" Datei oder "dotfile" (z.b. lokale Systemeinstellungen) - Gross-/Kleinschreibung ist WICHTIG. - Dateiendungen sind rein optional! - Leerstellen sind moeglich, sollten aber vermieden oder "escaped" werden! -- Bitte Bitte keine Minuszeichen als erstes Zeichen im Dateinamen! +- Bitte bitte bitte keine Minuszeichen als erstes Zeichen im Dateinamen! (geht zwar, tut aber weh. Loesung "--" als Trenner) + +** Was fuer Arten von Kommandos gibt es? +- Ausfuehrbare (chmod +x) dateien (im $PATH) +- Shell-builtins (z.b. cd, echo, alias) +- (selbstdefinierte) Shell-funktionen +- Aliase +*** Was und wo ist was? +- type +- which +- whereis +- echo $PATH + +** Hilfe zur Selbsthilfe +- Immer ausprobieren: --help Kurzhilfe +- manpages und infopages(!!!) (erfordert oft *-doc pakete) +- apropros (== man -k) +- help fuer shell buildins + + + +* Beispiele +** grep (Suchfunktion fuer Dateiinhalte mit oder ohne regex) +- grep -i "linuxparty" meinedatei +- grep -A 3 -i "pizza" meinedatei +- grep -r "hunger" * (oder "rgrep") + +** find und locate (Suchfunktion fuer Dateinamen) +- locate suchstring +- updatedb +- find -iname "*party* +- find . -type f -iname *.sh -print0 +- find -iname "MyCProgram.c" -exec md5sum {} \; +#+begin_src bash +find / -iname *.jpg -type f -print | xargs \ +tar -cvzf images.tar.gz +#+end_src + +** chmod / chown +- chmod ug+rwx meinedatei +- chown meinuser:meinegruppe meinedate + +** Liste meistbenutzter Kommandos +#+begin_src bash +history | awk '{CMD[$2]++;\ +count++;}END \ +{ for (a in CMD)print CMD[a]\ +" " CMD[a]/count*100 "% " a;}' \ +\| grep -v "./" | column -c3 -s \ +" " -t | sort -nr | nl | head -n10 +#+end_src + +** I/O umleiten +#+begin_src bash +ls > dateilisting.txt +sort < dateilisting.txt > sortiertes_dateilisting.txt +ls -la | less +ls -lt | head +du -h | sort -nr +find . -type f -print | wc -l +echo "test" > neuedatei +echo "muhalol" >> bereitsvorhandenedatei +#+end_src diff --git a/kiss/shell/whyshell.pdf b/kiss/shell/whyshell.pdf index 236c172fe3ed8263d21913b4717d9daed18294fd..d485c480da277817418915b581f448b7e376dcf7 100644 Binary files a/kiss/shell/whyshell.pdf and b/kiss/shell/whyshell.pdf differ diff --git a/kiss/shell/whyshell.tex b/kiss/shell/whyshell.tex index 62d4486c98c0f3b225016a2a94ac552a7ac39fb4..6d28c48e674f0dd27232dd4d653dbb0b5fd3828d 100644 --- a/kiss/shell/whyshell.tex +++ b/kiss/shell/whyshell.tex @@ -1,4 +1,4 @@ -% Created 2013-04-18 Thu 18:30 +% Created 2013-04-18 Thu 19:59 \documentclass[bigger]{beamer} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} @@ -19,7 +19,7 @@ \providecommand{\alert}[1]{\textbf{#1}} \title{Arbeiten auf der Commandozeile} -\author{Björn \& Milan} +\author{Björn, Milan \& Co.} \date{2012-10-18 Thu} \hypersetup{ pdfkeywords={}, @@ -39,7 +39,7 @@ \section{Einleitung} \label{sec-1} -\begin{frame} +\begin{frame}[fragile] \frametitle{Wozu eigentlich?} \label{sec-1-1} @@ -47,8 +47,11 @@ \item Bedienung eines Rechners, ggfs. nichtgrafisch ueber ssh (``Server''). \item Szenario: Man will auf einem Server den von allen Nutzern verwendeten Speicherplatz zusammenrechnen und das ganze als Textdatei abspeichern. -\item du -s * | sort -nr > \$HOME/user$_{\mathrm{space}}$$_{\mathrm{report}}$.txt \end{itemize} + +\begin{verbatim} +du -s * | sort -nr > $HOME/user_space_report.txt +\end{verbatim} \end{frame} \begin{frame} \frametitle{Warum eine GUI Umgebung nicht ausreicht} @@ -59,7 +62,9 @@ \end{itemize} Anwendungsgebiete und Aufgaben. \begin{itemize} -\item Symbolischer zugriff auf vorgefertigte Ablaeufe per Icon und Mausclick sind zwar bequem, aber unflexibel und koennen zu ungeniessbaren Workflows fuehren. +\item Symbolischer zugriff auf vorgefertigte Ablaeufe per Icon und Mausclick + sind zwar bequem, aber unflexibel und koennen zu ungeniessbaren + Workflows fuehren. \item RSI (Tennisarm) durch Mausschubsen. \item Repetetives stupides Arbeiten im GUI; Beispielaufgabe: Finde alle Textdateien in einer mehrfach verschachtelten Verzeichnisstruktur die eine gewisse Zeichenkette beinhalten und ersetze diese Zeichenkette durch eine andere. -> Typischer Fall fuer ein Script. \item GUIs und Desktopumgebungen aendern sich sehr oft und sind alles andere als uniform. @@ -71,38 +76,183 @@ Anwendungsgebiete und Aufgaben. \begin{itemize} \item Einmal ausgefuehrtes bleibt in der History (C-r fuer Rueckwaertssuche) -\item Man kann in einer Sprache (Syntax \& Semantik) mit dem Computer ``reden'' und ihm sehr praezise mitteilen was man will und ist nicht auf eine ``Babysprache'' beschraenkt. +\item Man kann in einer Sprache (Syntax \& Semantik) interaktiv mit dem Computer ``reden'' und ihm sehr praezise mitteilen was man will und ist nicht auf eine ``Babysprache'' beschraenkt. +\item Scriptbarkeit ``fuer spaeter'' \end{itemize} \end{frame} -\section{Rudimentaere Grundlagen} +\section{Grundlagen} \label{sec-2} \begin{frame} -\frametitle{Navigation} +\frametitle{Ein paar oft benutzte Kommandos (1)} \label{sec-2-1} \begin{itemize} \item pwd \item ls \item cd +\item mv +\item cp +\item rm +\item mkdir \item which \item cat \item less +\item tar \item man / info \item bash -\item \$PATH +\item env +\item chmod / chown \end{itemize} \end{frame} \begin{frame} -\frametitle{Ein paar Dinge zu Dateinamen} +\frametitle{Ein paar oft benutzte Kommandos (2)} \label{sec-2-2} +\begin{itemize} +\item top +\item grep +\item locate +\item find +\item cat +\item echo +\item alias +\item free +\item ps +\item df +\item fg +\item jobs +\item kill +\item nohup +\item su / sudo +\end{itemize} +\end{frame} +\begin{frame} +\frametitle{Verzeichnisstruktur} +\label{sec-2-3} + +\begin{itemize} +\item Hierarchie(!) Wurzel ``/'' ist ``ganz oben'' im Dateisystem (und nicht ``My Computer'' oder ``Arbeitsplatz''). +\item ``/home/\$USER'' bzw ``\~{}'' ist das Zuhause fuer persoenliche Nutzerdateien und Einstellungen (dotfiles) +\item ``.'' ist immer das aktuelle Verzeichnis, ``..'' bedeutet ``eine Ebene hoeher'' +\item Andere Verzeichnisse unter / beinhalten z.b. Systemweite Einstellungen, geteilte Dateien, Dokumentationen, Quellcodes, Binaerdateien (Pedant zu .exe unter Windows). +\item Verzeichnisse, Geraete und anderes Dinge koennen beliebig in die Hierarchie eingebunden werden (mount). +\item Umbenennen und Verschieben ist ein und dasselbe (denn nur der inode-eintrag im Dateisystem geaendert wird)! +\item Symbolische und ``Harte'' Verlinkung ist moeglich mit ``ln''. +\end{itemize} +\end{frame} +\begin{frame} +\frametitle{Ein paar Dinge zu Dateinamen} +\label{sec-2-4} + \begin{itemize} \item Ein mit einem Punkt ``.'' beginnender Dateiname steht fuer eine ``versteckte'' Datei oder ``dotfile'' (z.b. lokale Systemeinstellungen) \item Gross-/Kleinschreibung ist WICHTIG. \item Dateiendungen sind rein optional! \item Leerstellen sind moeglich, sollten aber vermieden oder ``escaped'' werden! -\item Bitte Bitte keine Minuszeichen als erstes Zeichen im Dateinamen! +\item Bitte bitte bitte keine Minuszeichen als erstes Zeichen im Dateinamen! (geht zwar, tut aber weh. Loesung ``--'' als Trenner) +\end{itemize} +\end{frame} +\begin{frame} +\frametitle{Was fuer Arten von Kommandos gibt es?} +\label{sec-2-5} + +\begin{itemize} +\item Ausfuehrbare (chmod +x) dateien (im \$PATH) +\item Shell-builtins (z.b. cd, echo, alias) +\item (selbstdefinierte) Shell-funktionen +\item Aliase +\end{itemize} +\begin{itemize} + +\item Was und wo ist was? +\label{sec-2-5-1}% +\begin{itemize} +\item type +\item which +\item whereis +\item echo \$PATH +\end{itemize} + +\end{itemize} % ends low level +\end{frame} +\begin{frame} +\frametitle{Hilfe zur Selbsthilfe} +\label{sec-2-6} + +\begin{itemize} +\item Immer ausprobieren: --help Kurzhilfe +\item manpages und infopages(!!!) (erfordert oft *-doc pakete) +\item apropros (== man -k) +\item help fuer shell buildins +\end{itemize} +\end{frame} +\section{Beispiele} +\label{sec-3} +\begin{frame} +\frametitle{grep (Suchfunktion fuer Dateiinhalte mit oder ohne regex)} +\label{sec-3-1} + +\begin{itemize} +\item grep -i ``linuxparty'' meinedatei +\item grep -A 3 -i ``pizza'' meinedatei +\item grep -r ``hunger'' * (oder ``rgrep'') +\end{itemize} +\end{frame} +\begin{frame}[fragile] +\frametitle{find und locate (Suchfunktion fuer Dateinamen)} +\label{sec-3-2} + +\begin{itemize} +\item locate suchstring +\item updatedb +\item find -iname ``*party* +\item find . -type f -iname *.sh -print0 +\item find -iname ``MyCProgram.c'' -exec md5sum \{} \; +\end{itemize} + +\begin{verbatim} +find / -iname *.jpg -type f -print | xargs \ +tar -cvzf images.tar.gz +\end{verbatim} +\end{frame} +\begin{frame} +\frametitle{chmod / chown} +\label{sec-3-3} + +\begin{itemize} +\item chmod ug+rwx meinedatei +\item chown meinuser:meinegruppe meinedate \end{itemize} \end{frame} +\begin{frame}[fragile] +\frametitle{Liste meistbenutzter Kommandos} +\label{sec-3-4} + + +\begin{verbatim} +history | awk '{CMD[$2]++;\ +count++;}END \ +{ for (a in CMD)print CMD[a]\ +" " CMD[a]/count*100 "% " a;}' \ +\| grep -v "./" | column -c3 -s \ +" " -t | sort -nr | nl | head -n10 +\end{verbatim} +\end{frame} +\begin{frame}[fragile] +\frametitle{I/O umleiten} +\label{sec-3-5} + + +\begin{verbatim} +ls > dateilisting.txt +sort < dateilisting.txt > sortiertes_dateilisting.txt +ls -la | less +ls -lt | head +du -h | sort -nr +find . -type f -print | wc -l +echo "test" > neuedatei +echo "muhalol" >> bereitsvorhandenedatei +\end{verbatim} +\end{frame} \end{document}