ABSTRACT: es wird die command substitution der shell erklaert AUDIENCE: beginners SYSTEM: any unix SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt vor kurzem haben wir gelernt wie die shell den inhalt einver variable an einer stelle in der commandline einsetzten kann: echo $USER wuerde den inhalt der environment varibale $USER an der stelle dort einsetzten und der eche befehl wuerde diesen wert dann ausgeben. anstatt den inhalt einer variable in die commandline einzusetzten kann man auch die ausgabe eines beliebigen befehls setzten. also z.b.: echo heute ist der $(date) das $( ) wird von der shell ersetzt mit der ausgabe des zwischen den klammern stehenden befehls. z.b.: echo bli $(echo bla) blo wirde "bli bla blo" ausgeben. nicht sehr sinnvoll aber demonstriert wie das ganze funktioniert: die shell fuehrt zuerst echo bla aus das ergebniss ist "bla" das wirt zwischen bli und blo eingesetzt d.h. es wird dann der befehl: echo bli bla blo ausgefuerht.. statt des $( ) kann man auch ` ` schreiben also die verkehrten einfachen anfuehrungszeichen (backgrave). ist aber meiner meinung nicht so gut lesbar. ich bevorzuge die $( ) schreibweise. manche aeltere shells kennen allerdings die $( ) schreibweise nicht. will man also portable script schreiben die auch auf anderen shells als der bash funktionieren so sind die ` (back grave) substition zu bevorzugen. wir haben also jetzt die moeglichkeit befehle zu schreiben die wiederum andere befehle aufrufen.. nagut ein sinnvolleres beispiel fuer die verwendung? die verwendungsmoeglichkeit sind natuerlich endlos. angenommen du hast ein file in dem in jeder zeile der name eines wichtigen files steht dass du jeden tag auf einen anderen server kopiern willst und es sind viele files und du willst sie nicht immer haendisch eintippen. legen wir uns z.b. so ein file an: echo *.txt arbeiten/*.{txt,gif,jpg,html} > wichtige.txt scp $(cat wichtige.txt) backupserver.irgendwo.at:backup/ dieser befehle wurde also jetzt alle im file wichtige.txt angegebenen files kopieren. oder: du willst dir ein shell skript mit dem namen: tagebuch schreien dass jedes mal wenn du es aufrust den joe startet mit dem file /home/maxmeier/tagebuecher/tagebuch2001.txt und dir an das ende des files das aktuelle datum schreibt. und dir den joe aufruft. das jahr soll natuelrich automatisch geschrieben werden. das scirpt koennte also so aussehn: #!/bin/bash TBUCH=$HOME/tagebuecher/tagebuch$(date +%Y).txt echo >> $TBUCH echo log buch eintrag auf $(hostname) fuer $USER am $(date) >> $TBUCH joe +99999999 $TBUCH echo >> $TBUCH echo ================================================== >> $TBUCH echo >> $TBUCH was tut dieses script? die erste zeile: #!/bin/bash sagt dass es ein bash script ist die zweite zeile: setzt die variable TBUCH dabei wird das aktuelle jahr eingesetzt (der befehl date +%Y gibt nur das jahr aus) und das jahr wird dort an der stelle eingefuegt. $HOME wird durch das homeverzeichniss ersetzt. der wert der variablen TBUCH waere also an dieser stelle z.b.: /home/maxmeier/tagebuecher/tagebuch2001.txt die naechster zeile haengt an dieses file eine leerzeile an. ( ein > alleine wuerde die datein ueberschrieben. zwei >> bedeutet die ausgabe des befehls anfuegen. die naechste zeile fuegt den text: log buch eintrag auf deincomputername fuer maxmeier am Mon Dec 10 13:04:36 MET 2001 ein. (der befehl hostname gibt immer den aktuellen namen deines computers aus. $USER ist dein username und der befehl date -R gibt das aktuelle datum aus. danach wird joe aufgerufen. mit +123 wuerde er beim starten an die zeile 123 springen. da wir aber eine so grosse zahl angegeben haben spring joe immer gleich ans ende. dort wollen wir ja unseren tagebuch text anfuegen. nach dem benden von joe werden dann noch 2 leerzeilen und eine line mit = zeichen angefuegt. um das script zu testen wuerdest du es also in ein file mit dem namen "tagebuch" speichern und es ausfuerbar machen: chmod ugo+r tagebuch dann koenntest du es mit: ./tagebuch anstarten.. (vorher aber noch mkdir tagebuecher nicht vergessen) EXERCISES: * versuche einer environment variablen den aktuellen wert der seit 1.1.1970 vergangenen sekunden zuzuweisen. ( date +%s koennte hierfuer nueztlich sein. siehe dazu auch die man page von date ) * gibt mit echo den wert aus. * in einem file namens wichtig.txt steht in jeder zeile der name eines verzeichnisses das mit tar gebackupt werden soll. wie koennte man mit command subsitution den tar befehl aufrufen so dass er genau diese verzeichnisse backupt? REFERENCES: man bash (nach "command substitution" suchen)