Schreiben von Shell-Linux-Skripten. Skripte sind nur

Wir stellen Ihnen ein Tutorial für das bash-Skript vor, das davon ausgeht, dass Ihr bash-Wissen gleich null oder nahe null ist. Wir versprechen Ihnen, dass Sie mit Hilfe dieses Artikels verstehen werden, dass das Erstellen von Bash-Skripts extrem einfach ist. Wenn Sie jedoch in diesem Artikel immer noch keine Antwort auf alle Ihre Fragen finden (oder, aus anderen Gründen benötigen Sie die Hilfe von Drittanbietern), können Sie sich direkt an unseren Administrator wenden.

Lassen Sie uns also die Bash-Befehls-Shell lernen.
Beginnen wir unser Training mit einem einfachen "Hello World" -Skript.

1. Hallo Welt Bash-Skript
  Zuerst müssen Sie herausfinden, wo sich der Übersetzer befindet. Geben Sie dazu den folgenden Befehl ein:
  $ welche bash
Öffnen Sie Ihren bevorzugten Texteditor und erstellen Sie eine Datei mit dem Namen hello_world.sh. Speichern Sie in dieser Datei die folgenden Zeilen:
  #! / bin / bash # deklariert eine Variable vom Typ STRING STRING = "Hello World" # druckt die Variable auf dem Bildschirm echo $ STRING
HinweisJedes Bash-Skript in diesem Lernprogramm beginnt mit einer Folge von "#!" - Zeichen, die nicht als Kommentar interpretiert werden!
Wechseln Sie in das Verzeichnis, in dem Sie die Datei hello_world.sh gespeichert haben, und machen Sie diese Datei ausführbar:
  $ chmod + x hello_world.sh
Nun sind Sie bereit, Ihr erstes Bash-Skript zu erstellen:
  ./hello_world.sh

2. Ein einfaches Bash-Skript für das Backup:
  #! / bin / bash tar -czf myhome_directory.tar.gz / home / linuxconfig

3. Variablen
In diesem Beispiel werden wir eine einfache bash-Variable deklarieren und mit dem Befehl echo anzeigen.
  #! / bin / bash STRING = "HALLO WORLD !!!" Echo $ STRING
Skript für Backup und Variablen:
  #! / bin / bash OF = myhome_directory _ $ (Datum +% Y% m% d). tar.gz tar -czf $ OF / home / linuxconfig

3.1. Globale und lokale Variablen
  #! / bin / bash # Deklarieren einer globalen Variablen # Diese Variable ist global und kann überall im Skript verwendet werden. VAR = "globale Variable" -Funktion bash (# Deklaration einer lokalen Variablen # Diese Variable ist lokal und kann nur in dieser Funktion bash local VAR verwendet werden = "local variable" echo $ VAR) echo $ VAR bash # Anmerkung: Die globale Variable hat sich nicht geändert. # "local" ist ein reserviertes Wort in bash echo $ VAR

4. Argumente an ein Bash-Skript übergeben
#! / bin / bash # Verwenden Sie zuvor definierte Variablen, um auf die übergebenen Argumente zuzugreifen, um auf die übergebenen Argumente zuzugreifen (" [E-Mail geschützt]") # echo Argumente für die Shell echo $ (args) $ (args) $ (args)" -\u003e args = (" [E-Mail geschützt]"); echo $ (args) $ (args) $ (args)" # use [E-Mail geschützt]   um alle Echoargumente auf einmal auszugeben [E-Mail geschützt]   "-\u003e Echo [E-Mail geschützt]"# Verwenden Sie die Variable $ #, um # die Anzahl der an das Bash-Skript übergebenen Variablen anzuzeigen. echo Anzahl der übergebenen Argumente: $ #" -\u003e echo Anzahl der übergebenen Argumente: $ # "/arguments.sh Bash-Skriptunterricht

5. Führen Sie Shell-Befehle mit Bash aus
  #! / bin / bash # Verwenden Sie "` `" Backquotes, um die Shell-Befehle auszuführen. echo `uname -o` # # Die aufgerufenen Befehle werden ohne Anführungszeichen aufgerufen. echo uname -o

6. Benutzereingabe lesen
  #! / bin / bash echo -e "Hallo, bitte geben Sie das Wort ein: \\ c" Lesen Sie das Wort Echo "Das von Ihnen eingegebene Wort kann sein: $ das Wort" Echo -e "Können Sie zwei Wörter eingeben?" Lesen Sie das Wort1 Wort2 Echo " Hier ist Ihre Eingabe: \\ "$ word1 \\" \\ "$ word2 \\" "echo -e" Wie fühlen Sie sich beim Bash-Scripting? "# Lesebefehl speichert Antworten auf die Standardvariable $ REPLY Read Echo" Sie sagten $ REPLY, ich "Ich bin froh das zu hören! "echo -e" Was sind deine Lieblingsfarben? "# -a erlaubt es dem Lesebefehl, mehrere Werte im Echoarray" read -a colors "zu speichern" Meine Lieblingsfarben sind auch $ (Farben), $ (Farben) und $ (Farben) :-) "

7. Bash-Trap-Befehl
  #! / bin / bash # trap trap bashtrap INT Befehl # bash-screen-clear Befehl clear; # Bash-Trap-Funktion wird ausgeführt, wenn STRG-C gedrückt wird; Bash zeigt die Meldung an =\u003e Bash-Trap ausführen! bashtrap () (Echo "STRG + C erkannt! ... Ausführung von Bash-Trap!") # für Werte von 1/10 bis 10/10 für a in 'seq 1 10'; echo "$ a / 10 zum Beenden". schlaf 1; fertig echo "Exit Bash Trap Example !!!"

8. Arrays
8.1. Ein einfaches Bash-Array deklarieren
  #! / bin / bash # deklariert ein Array von 3 Elementen ARRAY = ("Debian Linux" "Redhat Linux" ") Ubuntu Linux") # liefert die Anzahl der Elemente im Array ELEMENTS = $ (# ARRAY [@]) # gibt jedes Element des Arrays # für einen gegebenen Zahlenbereich von for Elementen aus ((i = 0; i

8.2. Importieren Sie die Datei in das Bash-Array
  #! / bin / bash # deklarieren -a Ein ARRAY-Array deklariert den # Ausgabedescriptor 10 an stdin exec 10

Ausführung des Bash-Skripts mit Ausgabe zur Datei-Ausführung mit einer Ausgabe:
linuxconfig.org $ cat bash.txt Anleitung zum Bash-Skripting linuxconfig.org $ ./bash-script.sh bash.txt Anzahl der Elemente: 4 Handbuch zum Bash-Skripting Tutorial linuxconfig.org $

9. Bash-Skripte mit if / else / fi
9.1. Einfacher Bash-Ausdruck mit if / else
Achten Sie auf die Leerzeichen in Klammern [und]! Ohne diese Leerzeichen funktioniert das Skript nicht.
  #! / bin / bash verzeichnis = "./ BashScripting" # bash prüfen, ob ein Verzeichnis vorhanden ist, wenn [-d $ verzeichnis]; dann echo "Verzeichnis existiert" sonst echo "Verzeichnis existiert nicht" fi

9.2. Eingebaut wenn / else
  #! / bin / bash # deklariert die ausgewählte Variable und weist ihr die Werte zu 4 Wahl = 4 # Ausgabe an stdout echo "1. Bash" echo "2. Scripting" echo "3. Tutorial" echo -n "Bitte wählen Sie ein Wort aus?" # Wiederholung der Schleife, während die Variable eine 4 # Bash-Schleife ist, während [$ choice -eq 4]; # Lesen Sie den eingegebenen Wert # Lesen Sie die Auswahl # Bash verschachtelt, wenn / else if [$ choice -eq 1]; dann Echo "Sie haben ein Wort gewählt: Bash", sonst wenn [$ choice -eq 2]; dann Echo "Sie haben Wort gewählt: Scripting", sonst wenn [$ choice -eq 3]; dann Echo "Sie haben das Wort gewählt: Tutorial" Anderes Echo "Bitte wählen Sie zwischen 1-3!" echo "1. Bash" echo "2. Scripting" echo "3. Tutorial" echo -n "Bitte wählen Sie ein Wort aus." choice = 4 fi fi fi fertig

10. Bash-Vergleich
10.1. Arithmetische Vergleiche
-lt -gt\u003e -le -ge\u003e =
-eq ==
-ne! =

  #! / bin / bash # Deklaration ganzzahliger Variablen NUM1 = 2 NUM2 = 2 if [$ NUM1 -eq $ NUM2]; dann echo "Beide Werte sind gleich" sonst Echo "Werte sind NICHT gleich" fi

  #! / bin / bash # Deklaration ganzzahliger Variablen NUM1 = 2 NUM2 = 1 if [$ NUM1 -eq $ NUM2]; dann echo "Beide Werte sind gleich" sonst Echo "Werte sind NICHT gleich" fi

  #! / bin / bash # Deklaration ganzzahliger Variablen NUM1 = 2 NUM2 = 1 if [$ NUM1 -eq $ NUM2]; dann echo "Beide Werte sind gleich" elif [$ NUM1 -gt $ NUM2]; dann Echo "NUM1 ist größer als NUM2", ansonsten Echo "NUM2 ist größer als NUM1" fi

10.2. Stringvergleich
= gleich
! = nicht gleich
\u003e größer als
-n s1 string s1 ist nicht leer
-z s1 string s1 ist leer

  #! / bin / bash # Stringdeklaration S1 S1 = "Bash" # Stringdeklaration S2 S2 = "Scripting" wenn [$ S1 = $ S2]; dann Echo "Beide Strings sind gleich", sonst Echo "Strings sind NICHT gleich" fi

  #! / bin / bash # Stringdeklaration S1 S1 = "Bash" # Stringdeklaration S2 S2 = "Bash" wenn [$ S1 = $ S2]; dann Echo "Beide Strings sind gleich", sonst Echo "Strings sind NICHT gleich" fi

11. Überprüfung der Bash-Datei
-b Dateiname - blockiert die Datei
-c Dateiname - Die Datei enthält Specials. Zeichen
-d Verzeichnisname - Überprüfen Sie das Vorhandensein eines Verzeichnisses
-e Dateiname - Überprüfen Sie, ob die Datei existiert
-f Dateiname - Überprüfung der Existenz eines Nicht-Verzeichnisses
-Gname Prüfen Sie, ob die Datei die Gruppen-ID ist.
-g Dateiname true, wenn die Datei vorhanden ist und eine Set-Gruppen-ID ist.
-k Dateiname klebriges Bit
-L Dateiname Symbolischer Link
-O Dateiname ist wahr, wenn es sich bei der Datei um eine Benutzer-ID handelt.
-r Dateiname - Überprüfen Sie die Verfügbarkeit der Datei
-S Dateiname Überprüfen Sie, ob die Datei Socket ist
-s Dateiname - Prüfen Sie, ob die Dateigröße größer als Null ist
-u Dateiname Überprüfen Sie, ob das Set-Ser-ID-Bit der Datei gesetzt ist
-w Dateiname - Datei überschreiben überprüfen
-x Dateiname - Dateiausführung überprüfen
  #! / bin / bash file = "./ file" wenn [-e $ file]; dann echo "Datei existiert" sonst echo "Datei existiert nicht" fi
Auf ähnliche Weise können Sie eine while-Schleife verwenden, um das Vorhandensein einer Datei zu überprüfen. Dieses Skript funktioniert nicht, solange die Datei vorhanden ist. Beachten Sie den Bash-Negationsoperator "!", Der die Funktion -e negiert.
  #! / bin / bash während [! -e meinedatei]; do # Reagiert nicht, während die Datei erstellt wurde und im Standby-Modus 1 vorhanden ist

12. Zyklus
12.1. Bash-Loop-Befehl
  #! / bin / bash # bash Schleife für f in $ (ls / var /); Echo $ f erledigt
Führen Sie die Schleife über die Bash-Befehlszeile aus:
  $ für f in $ (ls / var /); echo $ f; fertig

12.2. Schlag während Schleife
  #! / bin / bash COUNT = 6 # Bash-Schleife, während [$ COUNT -gt 0]; echo $ COUNT lassen COUNT = COUNT-1 fertig

12.3. Bash bis zum Zyklus
  #! / bin / bash COUNT = 0 # Bash-Zyklus bis [$ COUNT -gt 5]; echo $ COUNT lassen COUNT = COUNT + 1 fertig

12.4. Bash-Loop steuern
Nachfolgend finden Sie ein Beispiel für eine While-Schleife, die von der Standardeingabe gesteuert wird. Die Bash-While-Schleife funktioniert, solange ein Übergang von STDOUT zu STDIN und zum Lesebefehl erfolgt.
  #! / bin / bash # Dieses Bash-Skript sucht und ersetzt Leerzeichen in den Dateinamen DIR = "." # Steuern der Schleife mit dem Bash-Lesebefehl durch Umleiten von STDOUT zu # STDIN in einer While-Schleife # befehl finden   Dateinamen, die Leerzeichen enthalten, werden nicht verworfen. find $ DIR -type f | während gelesene Datei; # verwenden Sie die POSIX-Klasse [: space:], um nach einem Leerzeichen im Dateinamen zu suchen, wenn [["" $ file "= * [[::]] *]]; dann # ersetzt das Leerzeichen durch das Zeichen "_" und benennt die mv-Datei "$ file" um. `echo $ file | tr "" "_" `fi; # Ende der while-Schleife

13. Bash-Funktionen
#! / bin / bash # Bash-Funktionen können in beliebiger Reihenfolge deklariert werden function function_B (Echo Function B.) Funktion function_A (Echo $ 1) Funktion function_D (Echo Function D.) Funktion function_C (Echo $ 1) # Funktionsaufruf # übergeben Funktionsparameter A function_A "Funktion A." function_B # übergeben Sie die Parameterfunktion C function_C "Funktion C." function_D

14. Bash-Auswahl
  #! / bin / bash PS3 = "Wählen Sie ein Wort aus:" # bash select select word in "linux" "bash" "scripting" "Tutorial" do echo "Das von Ihnen ausgewählte Wort ist: $ word" # stoppt den Zyklus, andernfalls es wird eine unendliche Pause gemacht, Ausgang 0

15. wechseln
  #! / bin / bash echo "Was ist Ihre bevorzugte Programmier- / Skriptsprache" echo "1) bash" echo "2) perl" echo "3) python" echo "4) c ++" echo "5) Ich weiß es nicht! " Fall lesen # Struktur einer einfachen Bash-Bedingung # Anmerkung: In diesem Fall ist $ case eine Variable, die nicht so genannt werden muss. # Hier wird sie zum Beispiel case $ case in 1 genannt. echo "Sie haben bash ausgewählt" ;; 2) Echo "Sie haben Perl ausgewählt" ;; 3) Echo "Sie haben Python ausgewählt" ;; 4) Echo "Sie haben C ++ ausgewählt" ;; 5) esac verlassen

16. Zitate in Bash
Anführungszeichen sind ein wichtiges Element der Bash- und Bash-Skripts. Nachfolgend finden Sie einige Grundlagen zur Verwendung von Zitaten in Bash.
16.1. Screening sonderzeichen
Bevor wir Anführungszeichen verwenden, müssen wir lernen, wie Sonderzeichen ausgeblendet werden. Mit dieser Prozedur kann bash die Bedeutung dieser Zeichen direkt erkennen. Dazu müssen wir den Backslash "\\" verwenden. Zum Beispiel:
  #! / bin / bash # bash Deklaration einer Variablen vom Typ String BASH_VAR = "Bash Script" # Ausgabe der Variablen BASH_VAR echo $ BASH_VAR # Wenn das Sonderzeichen "$" mit dem Symbol "\\" gekennzeichnet ist, kann es direkt am echo \\ $ BASH_VAR # am Backslash erkannt werden Es gibt auch eine spezielle Bedeutung, die mit einem weiteren Schrägstrich "\\" echo "\\\\" angezeigt werden kann.

16.2. Einzelne Anführungszeichen
Bei einfachen Anführungszeichen in bash wird der Wert aller Sonderzeichen nicht berücksichtigt. So werden Sonderzeichen wörtlich erkannt. In diesem Fall können Sie in zwei Anführungszeichen nicht ein einzelnes Anführungszeichen verwenden, auch wenn eines von ihnen mit einem Backslash geschützt wird.
  #! / bin / bash # bash Deklaration einer Variablen vom Typ String BASH_VAR = "Bash Script" # Ausgabe der Variablen BASH_VAR echo $ BASH_VAR # Wert der Spezifikation. Zeichen in der Bash werden mit einfachen Anführungszeichen mit Escapezeichen "$ BASH_VAR" $ BASH_VAR "" versehen.

16.3. Doppelte Anführungszeichen
In Bash werden doppelte Anführungszeichen verwendet, um alle Sonderzeichen außer "$", "\\" und "` "zu schützen. Alle anderen Angebote. Zeichen werden wörtlich erkannt. Im Gegensatz zum vorherigen Absatz können einfache Anführungszeichen innerhalb von Anführungszeichen verwendet werden. Wenn Sie ein anderes Anführungszeichen zwischen Anführungszeichen verwenden müssen, können Sie Bash erkennen, dass sie mit dem umgekehrten Schrägstrich "\\" wörtlich erkannt werden. Zum Beispiel:
  #! / bin / bash # bash Deklaration einer Variablen vom Typ string BASH_VAR = "Bash Script" # echo-Variable BASH_VAR echo $ BASH_VAR # spez. das Zeichen und sein Wert werden mit # gekennzeichnet, wenn doppelte Anführungszeichen "$", "\\" und "" "echo" verwendet werden. Es werden $ BASH_VAR und $ BASH_VAR \\ "mit Backticks:` date` "verwendet.

16.4. Bash-Abschirmung ANSI-C
In bash gibt es auch eine andere Art von Screening - ANSI-C. Bei Verwendung dieser Art der Abschirmung erhalten Zeichen, die mit einem Backslash "\\" gekennzeichnet sind, eine besondere Bedeutung gemäß dem ANSI-C-Standard.
\\ a Alarm (Glocke)
\\ b Rücktaste
\\ e ein Fluchtzeichen
\\ f Formularvorschub
\\ n Newline
Wagenrücklauf
\\ t horizontale Registerkarte
\\ v vertikale Registerkarte
\\\\ Backslash
Einzelzitat
\\ nnn Oktalwert von Zeichen (siehe)
\\ xnn Hexadezimalwert von Zeichen (siehe)

Die Bezeichnung für ansi-c bash-shielding: $ "". Beispiel:
  #! / bin / bash # für das Beispiel haben wir \\ n für die neue Zeile verwendet, \\ x40 für den Hexadezimalwert @ # und \\ 56 für den Oktalwert. echo $ "web: www.linuxconfig.org \\ nemail: web \\ x40linuxconfig \\ 56org"

17. Arithmetische Operationen
17.1. Beispiel für die Hinzufügung mit Bash
  #! / bin / bash RESULT1 = $ 1 + $ 2 Echo $ 1 + $ 2 = $ RESULT1 "-\u003e # RESULT1 = $ 1 + $ 2" -i RESULT2 RESULT2 = $ 1 + $ 2 Echo $ 1 + $ 2 = $ RESULT2 "-\u003e # -i ERGEBNIS2 angeben; ERGEBNIS2 = $ 1 + $ 2 "Echo $ 1 + $ 2 = $ (($ 1 + $ 2)) -\u003e # $ (($ 1 + $ 2))

17.2. Bash-Arithmetik
#! / bin / bash echo "# let #" # bash-Addition let ADDITION = 3 + 5 echo "3 + 5 =" $ ADDITION # bash subtrahieren let SUBTRACTION = 7-8 echo "7 - 8 =" $ SUBTRACTION # bash multiplizieren lassen MULTIPLICATION = 5 * 8 echo "5 * 8 =" $ MULTIPLICATION # bash Division let Division DIVISION = 4/2 echo "4/2 =" $ DIVISION # bash Modul MODULUS = 9% 4 echo "9% 4 =" $ MODULUS # bash Exponentiation lassen Sie POWEROFTWO = 2 ** 2 echo "2 ^ 2 =" $ POWEROFTWO echo "# Bash Arithmetic Expansion #" # Es gibt zwei Formate für arithmetische Ausdrücke: $ [expression] # und $ ((expression # )) - Sie können das gewünschte Echo wählen. 4 + 5 = $ ((4 + 5)) Echo 7 - 7 = $ [7 - 7] Echo 4 x 6 = $ (((3 * 2)) Echo 6/3 = $ ((6/3)) Echo 8% 7 = $ ((8% 7)) Echo 2 ^ 8 = $ [2 ** 8] Echo "# Declare #" Echo -e "Bitte geben Sie zwei ein Zahlen \\ c "#cc Erkennung Read num1 num2 deklarieren -i result = $ num1 + $ num2 echo "Ergebnis ist: $ result" # bash konvertiert eine binäre Zahl 10001 result = 2 # 10001 echo $ result # bash konvertiert eine oktale Zahl 16 result = 8 # 16 echo $ result # bash konvertiert Hexadezimalzahl 0xE6A Ergebnis = 16 # E6A Echo $ Ergebnis

17.3. Fließpunktrundung
  #! / bin / bash # erhält eine Gleitkommazahl floating_point_number = 3.3446 echo $ floating_point_number # rundet eine Gleitkommazahl mit bash für bash_rounded_number in $ (printf% .0f $ floating_point_number); do echo "Abgerundete Zahl mit bash:" $ bash_rounded_number fertig

17.4. Bash-Gleitkommaberechnungen
  #! / bin / bash # Implementierung eines einfachen Linux-Rechners auf Bash-Echo "Eingabe eingeben:" Benutzereingang lesen # Das Ergebnis mit zwei Nachkommastellen ausgeben "Echo" Ergebnis mit 2 Stellen nach dem Dezimalpunkt: "Echo" scale = 2; $ (Benutzereingabe ) "| bc # Anzeige des Ergebnisses mit zehn Nachkommastellen echo "Ergebnis mit 10 Nachkommastellen:" echo "scale = 10; $ (userinput)" | bc # gibt das Ergebnis als gerundete Ganzzahl aus. echo "Ergebnis als gerundete Ganzzahl:" echo $ userinput | bc

18. Weiterleitungen
18,1. STDOUT aus dem Bash-Skript in STDERR
  #! / bin / bash echo "Dieses STDOUT nach STDERR umleiten" 1\u003e & 2
Um die STDOUT-Umleitung in STDERR zu überprüfen, können Sie die Ausgabe des Skripts in eine Datei umleiten:

18.2. STDERR vom Bash-Skript zu STDOUT
  #! / bin / bash cat $ 1 2\u003e & 1
Um die STDERR i STDOUT-Umleitung zu überprüfen, können Sie die Ausgabe des Skripts in eine Datei umleiten:

18.3. Stdout auf dem Bildschirm
Eine einfache Möglichkeit, STDOUT umzuleiten, besteht darin, einfach einen beliebigen Befehl zu verwenden, da standardmäßig STDOUT automatisch auf dem Bildschirm angezeigt wird. Erstellen Sie jedoch zuerst die Datei "file1":
  $ touch file1 $ ls file1 file1
Wie Sie im obigen Beispiel sehen können, ruft die Ausführung des Befehls ls STDOUT auf, der standardmäßig auf dem Bildschirm angezeigt wird.

18.4. Stdout in die Datei
Um das Standardverhalten von STDOUT zu blockieren, können Sie die Ausgabe mit "\u003e" in eine Datei umleiten:
  $ ls file1\u003e STDOUT $ cat STDOUT file1

18,5. Stderr in die Datei
Standardmäßig wird STDERR auf dem Bildschirm angezeigt:
  $ ls file1 STDOUT $ ls file2 ls: kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnis
Im folgenden Beispiel werden wir den Standardfehler (stderr) auf eine Datei und standardmäßig stdout auf den Bildschirm umleiten. Beachten Sie, dass STDOUT auf dem Bildschirm angezeigt wird und STDERR in eine Datei mit dem Namen STDERR geschrieben wird:
  $ ls Datei1 STDOUT $ ls Datei1 Datei2 2\u003e STDERR Datei1 $ cat STDERR ls: Kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnis

18,6. STDOUT zu STDERR
Es ist auch möglich, STDOUT und STDERR auf eine Datei umzuleiten. Im folgenden Beispiel werden wir STDOUT an denselben Deskriptor wie STDERR weiterleiten. Sowohl STDOUT als auch STDERR werden in die Datei "STDERR_STDOUT" umgeleitet.
  $ ls Datei1 STDERR STDOUT $ ls Datei1 Datei2 2\u003e STDERR_STDOUT 1\u003e & 2 $ cat STDERR_STDOUT ls: Kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnisdatei1
Die Datei STDERR_STDOUT enthält jetzt sowohl STDOUT als auch STDERR.

18,7. STDERR zu STDOUT
Das obige Beispiel kann konvertiert werden, um STDERR zu demselben Deskriptor wie SDTOUT umzuleiten:
  $ ls Datei1 STDERR STDOUT $ ls Datei1 Datei2\u003e STDERR_STDOUT 2\u003e & 1 $ cat STDERR_STDOUT ls: Kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnisdatei1

18,8. STDERR und STDOUT zur Ablage
In beiden oberen Beispielen werden STDOUT und STDERR in eine Datei umgeleitet. Es gibt einen anderen Weg, um den gleichen Effekt zu erzielen:
  $ ls Datei1 STDERR STDOUT $ ls Datei1 Datei2 &\u003e STDERR_STDOUT $ cat STDERR_STDOUT ls: Kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnisdatei1
oder
  ls Datei1 Datei2\u003e & STDERR_STDOUT $ cat STDERR_STDOUT ls: Kann nicht auf Datei2 zugreifen: Keine solche Datei oder Verzeichnisdatei Datei1

Dieser Artikel ist eine Amateurübersetzung eines Artikels mit

Irgendein Anfängersystem linux-Administrator   Früher oder später mit so etwas konfrontiert wie " skriptSei es eines der Boot-Skripte /etc/rc.d/rc   oder ein Konfigurationsskript, das von einem Softwareentwickler geschrieben wurde konfigurieren. In diesem Artikel werde ich versuchen, das Schreiben von Skripten zu zeigen schale Selbst ein Neuling in der Linux-Welt ist nichts Außergewöhnliches und durchaus fähig.

Beginnen wir damit, dass wir verstehen, was hinter den englischen Begriffen steckt schaleund skript. Shelloder eine Shell, wie dieser Begriff manchmal übersetzt wird, ist ein Befehlsinterpreter, eine Schnittstelle zwischen dem Benutzer und dem Betriebssystem, seinem Kern. Daneben ist es aber auch eine mächtige Programmiersprache und Skripting. Es enthält seine eigenen offiziellen Wörter und Kontrollstrukturen und ermöglicht es Ihnen, Programme darauf zu schreiben. Ein solches Scripting-Programm aufgerufen ein Skript, kann Systemaufrufe und Befehle kombinieren betriebssystemsowie externe Dienstprogramme erstellen ein leistungsfähiges Werkzeug für die Systemverwaltung.

Eine der Aufgaben der Systemadministration ist zurück   wichtige informationen. Betrachten wir daher ein Beispiel eines Skripts, das Sicherungsinformationen implementiert.

Erste Schritte

Deshalb müssen wir zuerst die Struktur des Skripts verstehen. Es ist keine große Sache. Im Großen und Ganzen ist das einfachste Skript nur eine Auflistung von Systembefehlen. Zum Beispiel:

Echo Dies ist nur ein Beispiel
whoami
uname -a

Diese Befehle sind in einer Datei zusammengefasst. Die Shell sollte jedoch wissen, dass sie diese Datei verarbeiten und nicht nur den Inhalt lesen soll. Dafür ist ein besonderes Design: #!

Dieses Design heißt " sha-bang". # Setzt zwar einen Kommentar, aber in diesem Fall bedeutet sha-bang, dass der Pfad zum Skript-Handler folgt. Zum Beispiel:

  #! / bin / bash
#! / bin / sh
#! / usr / bin / perl

Wir werden uns auf Bash, Bourne-Again-Shell konzentrieren. Diese Shell wird standardmäßig in fast allen Linux-Systemen installiert und bezieht sich auf / bin / sh. Am Ende des Skripts wird das Service-Wort beendet.

Mit diesem Wissen werden wir unser erstes Skript schreiben:

  #! / bin / bash
echo Ein einfaches Skript: Der Befehl Echo zeigt eine Nachricht an.
echo Sie:
whoami # whoami zeigt den Namen des registrierten Benutzers an
echo Ihr System wurde gestartet
betriebszeit # Betriebszeit zeigt die Einschaltzeit der Maschine an
echo heute
datum # Datum zeigt das aktuelle Datum und die Uhrzeit an
echo während alle
ausfahrt

Speichern Sie diese Datei als tutor1.sh. Führen Sie den Befehl aus, um das Skript ausführbar zu machen.

Chmod + rx tutor1.sh

Das Ergebnis des Skripts lautet:

[E-Mail geschützt]: ~ / Doc / open source $ ./tutor1.sh
Einfaches Skript
Du:
voland
Ihr System wurde gestartet
14:38:46 bis 1:48, 2 Benutzer, Lastdurchschnitt: 0,47, 0,43, 0,41
Heute
So Feb 26 14:38:46 MSK 2006
Tschüss alle

Wir wenden uns ernster an.

Nun, da wir gelernt haben, wie man einfache Skripte schreibt, ist es an der Zeit, sich mit ernsthaften Dingen zu beschäftigen: Schreiben eines Skripts für das Backup.

Zuerst müssen Sie definieren - sicherungskopie   Was machen wir? Daher sollte unser Skript mit der Befehlszeile arbeiten können. Befehlszeilenargumente werden nach dem Skriptnamen durch ein Leerzeichen getrennt angegeben: somescript arg1 arg2 arg3. Das Skript verwendet die Argumente gemäß ihren Folgenummern. Daher werden Konstruktionen der Form $ number_argument verwendet, d. H. 1 $, 2 $, 3 $. $ ist ein Platzhalterzeichen, das wir zum Arbeiten mit Variablen benötigen. Variablen im Skript werden als Variablenname = Wert angegeben. Wir verwenden die MAXPARAMS-Variablen, um die maximale Anzahl von Befehlszeilenparametern zu bestimmen, BACKUPFILE, um den Namen des Archivs festzulegen, BACKUPDIR für den zu sichernden Ordner und ARCHIVEDIR für den Ordner, in den das Archiv abgelegt wird. Der wichtigste Teil des Skripts sind die Befehle zum Suchen und Archivieren aller gefundenen Dateien und Ordner in den angegebenen:

Finden -type f -print0 | xargs -0 tar rvf "$ archive.tar"\u003e / dev / null
gzip $ archive.tar

Mal sehen, was diese Befehle bewirken. find durchsucht das aktuelle Verzeichnis (dies wird durch das erste "." - Argument angegeben) aller Dateien und gibt den vollständigen Pfad zu ihnen zurück (print0). Diese Pfade werden an den Befehl tar weitergeleitet, der alle Dateien in einer Datei sammelt. Anschließend archivieren wir die entstehende tar-Datei mit dem Befehl gzip. Team \u003e / dev / null   Dies ist praktisch, wenn Sie eine große Anzahl von Dateien archivieren. In diesem Fall werden ihre Namen und der vollständige Pfad dazu nicht auf der Konsole angezeigt.

Der nächste Schritt besteht darin, dem Benutzer Hinweise zur Verwendung des Skripts zu geben, wenn er Fehler macht.

Zum Beispiel diese Konstruktion

Wenn [$ # -lt "$ MAXPARAMS"];
dann
echo

echo
ausfahrt 0
fi

teilt Ihnen mit, dass der Benutzer eine unzureichende Anzahl von Befehlszeilenargumenten angegeben hat. Wenn [Bedingung] ... fi   legt die bedingte Konstruktion fest. $ # -lt "$ MAXPARAMS"   überprüft die eingegebene Anzahl von Parametern. Wenn diese Anzahl weniger als MAXPARAMS ist, erhält der Benutzer eine Meldung über einen fehlerhaften Eintrag. Exit 0 bewirkt, dass das Skript ohne Angabe eines Fehlercodes nicht mehr funktioniert. In ähnlicher Weise wird die Überschreitung der zulässigen Anzahl von Parametern geprüft. Statt ls (kleiner als - kleiner als) müssen Sie gt (größer als - mehr als) angeben. Nun, da die wichtigsten Punkte des Skripts geklärt sind, können Sie zur Vollversion übergehen:

  #! / bin / bash
Beschreibung:
# + Sichert alle Dateien im angegebenen Verzeichnis.
# + im "Tarball" (Archiv tar.gz).
# + Verwendung:
# + sh backup.sh Archivordner Quellordner Zielordner
#+

# Maximale Anzahl der Befehlszeilenparameter
MAXPARAMS = 3

wenn [$ # -lt "$ MAXPARAMS"];
dann
echo
echo "Verwendung: sh` Basisname $ 0` Archivname Quellordner Ordnerziel"
echo
ausfahrt 0
fi

wenn [$ # -gt "$ MAXPARAMS"];
dann
echo
echo "Dieses Skript benötigt nur $ MAXPARAMS-Befehlszeilenargumente!"
echo
ausfahrt 0
fi

# Variablen, die wir im Skript verwenden
BACKUPFILE = $ 1-backup - $ (Datum +% m-% d-% Y)
archiv = $ BACKUPFILE
BACKUPDIR = $ 2
ARCHIVEDIR = 3 $

# Prüfen Sie, ob es einen Quellordner und einen Zielordner gibt
wenn [! -e $ BACKUPDIR];
dann
echo
echo "\\" $ BACKUPDIR \\ "existiert nicht!"
echo
ausfahrt 0
fi

wenn [! -e $ ARCHIVEDIR];
dann
echo
echo "\\" $ ARCHIVEDIR \\ "existiert nicht, erstellen Sie ..."
mkdir $ ARCHIVEDIR
echo "Fertig".
fi

# Prüfen Sie, ob sich in Quelle und Ziel Archive befinden.
cD $ ARCHIVEDIR
if [-e $ archive.tar.gz];
dann rm $ archive.tar.gz
fi

cD $ BACKUPDIR
if [-e $ archive.tar.gz];
dann rm $ archive.tar.gz
fi

# Der Hauptteil des Skripts ...
echo "$ BACKUPDIR \\" in Datei \\ "$ archive.tar.gz \\" ... "sichern" ... "
finden -type f -print0 | xargs -0 tar rvf "$ archive.tar"\u003e / dev / null
gzip $ archive.tar
echo "\\" $ BACKUPDIR \\ "wurde erfolgreich in der Datei \\" $ archive.tar.gz \\ "archiviert."

# Verschieben Sie das Archiv in den Ordner ARCHIVEDIR
echo "Verschieben des Archivs" $ archive.tar.gz "in den Ordner" "$ ARCHIVEDIR \\". "
mv $ archive.tar.gz $ ARCHIVEDIR / $ archive.tar.gz
echo "Fertig".

Hoffentlich habe ich die wichtigsten Punkte ausführlich kommentiert. Wenn Sie Fragen haben, können Sie mich unter kontaktieren [E-Mail geschützt]   Ich empfehle auch den bemerkenswerten Mendel Cooper Advanced Bash-Scripting Guide, der mir sehr half, als ich gerade mit den Skripten vertraut wurde. Erfolgreiche Programmierung

P.S. Herzlichen Dank mar   für ihre Kommentare und Ratschläge.

  ("Die Kunst des Programmierens in der Command Shell Scripting Language") enthält zu viel Referenzmaterial. Und zwischen diesen beiden Extremen gibt es nichts. Ich habe dieses Handbuch auch geschrieben, weil es nicht genügend kostenlose Grundkurse gibt, obwohl Sie sich diese anhören sollten.

Dies ist ein praktischer Leitfaden, in dem ich, obwohl nicht immer in einem eher seriösen Stil, praktische Beispiele anstelle von theoretischen Beispielen gebe. Ich habe zum Teil geschrieben, dass dies auf die Tatsache zurückzuführen ist, dass ich nicht beschnittene und übermäßig einfache Beispiele geben möchte, die von denen angeboten werden, die wissen, worüber sie sprechen, und einige wirklich coole Funktionen von Bash zeigen, die jedoch so aus dem Zusammenhang gerissen sind, dass Sie sie niemals verwenden können sie in praktischer Hinsicht. Sie können darüber nachlesen, nachdem Sie dieses Buch gelesen haben. Es enthält Übungen und Beispiele, die Ihnen im wirklichen Leben helfen werden.

Aus meiner praktischen Erfahrung als UNIX / Linux-Benutzer, Systemadministrator und Lehrer weiß ich, dass Menschen jahrelang täglich mit ihren Systemen kommunizieren können und nicht wissen, wie sie die Ausführung von Aufgaben automatisieren. Daher denken sie oft, dass das UNIX-System für Benutzer unbequem ist, und noch schlimmer: Sie haben den Eindruck, dass dies ein langsames und altmodisches System ist. Dies ist ein weiteres Problem, das mit diesem Handbuch gelöst werden kann.

Wer sollte dieses Buch lesen?

Jeder, der mit UNIX- oder UNIX-ähnlichen Systemen arbeitet, der das Leben für sich selbst, erfahrene Benutzer und Benutzer einfacher machen möchte systemadministratoren. Leser, die bereits wissen, wie mit dem System über die Befehlszeile gearbeitet wird, lernen alle Details zum Erstellen von Shell-Skripts kennen, mit denen Sie die täglichen Aufgaben vereinfachen können. Die Systemadministration ist stark vom Scripting abhängig. Alltägliche Aufgaben werden oft durch automatisiert einfache Skripte. In diesem Dokument gibt es viele Beispiele, die Sie dazu inspirieren werden, Ihre eigenen Skripte zu schreiben und vorhandene Skripte zu verbessern.

Bevor Sie mit diesem Kurs fortfahren:

  • sie müssen ein erfahrener UNIX- oder Linux-Benutzer sein, der mit den grundlegenden Befehlen, Man-Beschreibungsseiten und Dokumentation vertraut ist.
  • einen Texteditor verwenden können;
  • verstehen, wie das System bootet und die Prozesse stoppt, was init tut und wie init-Skripts verwendet werden;
  • benutzer und Gruppen erstellen, Passwörter festlegen;
  • wissen, was Zugriffsrechte und spezielle Modi sind;
  • die Regeln für die Benennung von Geräten kennen, verstehen, was Partitionen sind, Dateisysteme ein- / aushängen;
  • hinzufügen können software   in Ihr System und entfernen Sie es aus dem System.

Wenn Sie mit einem oder mehreren der oben aufgeführten Themen nicht vertraut sind, lesen Sie das Buch Einführung in Linux auf der TLDP-Website oder in Ihrem lokalen TLDP-Spiegel. Weitere Informationen finden Sie in Ihrer Systemdokumentation (Man- und Info-Seite) oder auf der Website des Linux Documentation Project.

Dieses Handbuch ist in gedruckter Form auf Fultus.com verfügbar.

Fig.1. Cover des Buches "Guide to Bash für Anfänger"

Dieser Leitfaden wurde übersetzt:

Eine Übersetzung ins Französische wird gerade erstellt und ein Link dazu wird sofort nach Abschluss der Übersetzung gegeben.

Historie ändern

Historie ändern

Die Wünsche der Leser wurden berücksichtigt: Korrekturen des Schichtbefehls in Kapitel 9 wurden korrigiert, Tippfehler in Kapitel 7, Kapitel 3, Kapitel 10.

Berücksichtigt die Wünsche der Leser.

Geänderte Adresse

Leserkommentare werden eingefügt, ein Index wurde mithilfe von DocBook-Tags hinzugefügt.

Ein Beispiel wurde in Kapitel 4 erläutert, die Beschreibung der eingebetteten Dokumente (hier doc) in Kapitel 9 wurde korrigiert, eine allgemeine Überprüfung und Korrektur typografischer Fehler wurde hinzugefügt, und Verweise auf chinesische und ukrainische Übersetzungen wurden hinzugefügt, eine Anmerkung usw. zu awk in Kapitel 6.

Fehler in den Kapiteln 3, 6 und 7 behoben, Benutzerkommentare hinzugefügt, in Kapitel 7 eine Anmerkung hinzugefügt.

Ein wenig über Debugging, ein paar Stichworte, Informationen zum neuen Bash 3.0 hinzugefügt, ein Bild hinzugefügt.

Erstveröffentlichung für LDP; Weitere Beispiele, mehr Hinweise, weniger Fehler und Auslassungen, Glossar hinzugefügt

Revision 1.0-Beta

Danke

Vielen Dank an alle Freunde, die geholfen haben (oder versucht haben zu helfen) und an meinen Mann. Ihre ermutigenden Worte haben diese Arbeit möglich gemacht. Vielen Dank an alle, die Fehler gemeldet, Beispiele und Kommentare gesendet haben - unter vielen anderen:

  • Hans Bol (Hans Bol) zu einem der Fans;
  • Mike Sim (Mike Sim) für Kommentare zum Stil;
  • Dan Richter für Beispiele mit Arrays;
  • Georges Ferguson (Gerg Ferguson) für Ideen zu Titeln;
  • Mendel Le Cooper (Mendel Leo Cooper), der einen Arbeitsplatz zur Verfügung stellte;
  • # linux.be, um mich flott zu unterstützen;
  • Frank Wang, für ausführliche Kommentare zu allem, was ich falsch gemacht habe ;-)

Besonderer Dank geht an Tabatha Marshall, die sich zur Überprüfung der Rechtschreibung und Grammatik verpflichtet hat. Wir hatten tolles Team: sie hat gearbeitet, als ich geschlafen habe. Umgekehrt;-)

(wir sprechen über Fehler in der englischen Version - dauerwelle).

Informationen zum Urheberrecht

* Copyright (c) 2002-2007, Machtelt Garrels * Alle Rechte vorbehalten. Folgende Bedingungen sind erfüllt: * * * * * * * * * * *) * * * Umverteilungen in binärer Form sind in der Dokumentation enthalten. Es kann in der Regel verwendet werden. * DIESE SOFTWARE WIRD VOM AUTOR UND BEITRAGENDEN "WIE BESEHEN" UND EINEM AUSDRÜCKLICHEN ODER IMPLIZIERTEN ZUSTAND ZUR VERFÜGUNG GESTELLT, DIE FÜR DEN BESTIMMTEN ZWECK DIE REPUBLIK DER MARKTFÄHIGKEIT UND EIGNUNG SIND IN * EVENT DIREKTE, INDIREKTE, ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT, BESCHAFFUNG DES ERSATZES) GEWINNE; BESTELLUNG VON INTERFORMATIVEN, WENN VERTRAGSWEGE, EINSCHLIESSLICH VERHANDELN ODER ANDERE AUFGABEN;) MÖGLICHKEIT DIESER SCHÄDEN.

Der Autor und der Herausgeber, um die Richtigkeit der Informationen zu gewährleisten, haben bei der Erstellung dieses Buches alle Anstrengungen unternommen. Die in diesem Buch enthaltenen Informationen werden jedoch ohne ausdrückliche oder stillschweigende Garantie angeboten. Weder der Autor, Herausgeber, Händler noch der Vertriebshändler übernehmen die Verantwortung für Schäden, die direkt oder indirekt durch dieses Buch verursacht wurden.

Die in diesem Buch verwendeten Logos, Marken und Symbole sind Eigentum der jeweiligen Inhaber.

Was brauchen Sie?

Organisation dieses Dokuments

In diesem Handbuch werden Konzepte erläutert, die sich für ernsthafte Bash-Benutzer in ihrem täglichen Leben als nützlich erweisen. Obwohl der Leser Grundkenntnisse über die Verwendung der Befehlsshell benötigen wird, beginnen wir in den ersten drei Kapiteln mit einer Besprechung der Hauptkomponenten der Befehlsshell und mit praktischen Beispielen.

In den Kapiteln vier bis sechs werden grundlegende Werkzeuge beschrieben, die häufig in Shell-Skripts verwendet werden.

In den Kapiteln acht bis zwölf werden die typischen Konstrukte beschrieben, die in Shell-Skripts verwendet werden.

Jedes Kapitel enthält Übungen, mit denen Sie Ihre Bereitschaft für das nächste Kapitel überprüfen können.

  • Kapitel 1 "Befehls-Shell und Bash-Skripts" - Grundlagen von Bash: Warum Bash so gut ist, Komponenten, erste Tipps zum Entwickeln guter Skripts.
  • Kapitel 2 "Skripte schreiben und debuggen" - Grundlagen von Skripten: Schreiben und Debuggen von Skripten.
  • Kapitel 3 "Bash-Umgebungsumgebung" - Bash-Umgebungsumgebung: Initialisierungsdateien, Variablen, Ändern der Eigenschaften von Sonderzeichen, Reihenfolge der Ersetzungen in befehls-Shell, Aliase, Parameter.

Nachdem Sie diesen Artikel gelesen haben, erfahren Sie, was ist bash   (Standard-Linux-Befehlsinterpreter), lernen Sie, wie Sie mit Standardbefehlen umgehen: ls, cp, mv... verstehen den Zweck von Inodes, harten und symbolischen Links und vielem mehr.

Dieses Handbuch ist für Anfänger in Linux und für diejenigen gedacht, die die grundlegenden Prinzipien von Linux, wie das Kopieren und Verschieben von Dateien, das Erstellen von Links, mithilfe von Standard-Linux-Befehlen zusammen mit Umleitungen und Pipes wiederholen oder verbessern möchten. In diesem Artikel finden Sie viele Beispiele, die das präsentierte Material erläutern. Für Anfänger sind die meisten Informationen neu und für fortgeschrittene Benutzer kann dieses Material ein hervorragendes Instrument zur Verallgemeinerung vorhandener Kenntnisse und Fertigkeiten sein.

Einführung in die bash

Shell

Wenn Sie Linux verwenden, wissen Sie, dass Sie nach dem Login von einer Einladung des Befehlsinterpreters begrüßt werden. Zum Beispiel:

\$

Wenn nach dem Login eine grafische Shell geladen wird, müssen Sie den Terminal-Emulator (gnome-terminal, xfce4-terminal, konsole, xterm, rxvt ...) starten, um zum Befehlsinterpreter zu gelangen, oder drücken Sie, um zu einem der virtuellen Terminals zu wechseln CtrlAltF1   oder CtrlAltF2   usw.

Die Eingabeaufforderung auf Ihrem Computer kann sich von der im Beispiel gezeigten unterscheiden. Es kann den Benutzernamen, den Computernamen und den Namen des aktuellen Arbeitsverzeichnisses enthalten. Trotz all dieser Unterschiede heißt das Programm, das diese Einladung druckt, " schale"(Shell), und am wahrscheinlichsten in der Rolle Ihrer Befehls - Shell ist ein Programm namens bash.

Läufst du Bash?

Sie können mit dem folgenden Befehl überprüfen, ob bash ausgeführt wird:

\$ echo \\ $ SHELL / bin / bash

Wenn Sie durch die Ausführung dieses Befehls einen Fehler erhalten haben oder dessen Ausgabe sich von dem im Beispiel unterscheidet, kann es sein, dass Ihr System keine bash als Befehlsshell verwendet. Trotzdem ist das meiste Material relevant, aber es wird dennoch empfohlen, auf bash umzusteigen. Dies kann (wenn im System bash installiert ist) mit dem Befehl:

\$ bash

Was ist bash?

Bash (Abkürzung für " Bunserne- agewinnen SHell ") ist der Standardbefehlsinterpreter auf den meisten Linux-Systemen. Zu seinen Aufgaben gehört die Verarbeitung und Ausführung von Befehlen, mit denen der Benutzer den Computer steuert. Nachdem Sie die Arbeit abgeschlossen haben, können Sie den Befehlsinterpreterprozess abschließen. Nach dem Drücken der Tasten CtrlD, Teams ausfahrt   oder abmelden   Der Shell-Vorgang wird abgeschlossen und der Bildschirm fordert Sie erneut auf, Ihren Benutzernamen und Ihr Kennwort einzugeben.

"Cd" verwenden

Beginnen wir mit bash, um im Dateisystem zu navigieren. Geben Sie den folgenden Befehl ein, um zu beginnen:

$ cd /

Mit diesem Befehl haben wir bash angegeben, dass wir in das Stammverzeichnis wechseln wollen - / . Alle Verzeichnisse im System sind in einer Baumstruktur organisiert und /   Dies ist der Anfang (oder die Wurzel). Team cd   dient zum Ändern des aktuellen Arbeitsverzeichnisses.

Pfade

Um herauszufinden, wo Sie sich aktuell im Dateisystem befinden (aktuelles Arbeitsverzeichnis), geben Sie Folgendes ein:

\$ pwd /

Im obigen Beispiel /   - Befehlsargument cd   - gerufen der Weg. Dies ist der Ort des Dateisystems, an den wir verschieben möchten. In diesem Fall /   - absoluter Pfad, dh der Pfad wird relativ zum Stammverzeichnis angegeben.

Absolute Wege

Hier sind einige Beispiele für absolute Pfade.

   / dev / usr / usr / bin / usr / local / bin

Wie Sie vielleicht bemerkt haben, sind alle diese Pfade durch die Tatsache vereint, dass sie damit beginnen / . Angabe des Pfads / usr / local / bin als Argument für den Befehl cd   Wir sagen ihm, dass er in das Stammverzeichnis gehen soll / , dann zum usr-Verzeichnis, dann zu local und bin. Absolute Pfade beginnen immer mit /

Relative Pfade

Die zweite Art von Pfad wird als relativ bezeichnet. BashTeam cd   und andere Befehle zählen diese Pfade relativ zum aktuellen Verzeichnis. Relative Pfade beginnen nie mit / . Zum Beispiel, wenn wir uns in / usr befinden

\$ cd / usr

Dann können wir mit dem relativen Pfad nach / usr / local / bin gehen

\$ cd local / bin \$ pwd   / usr / local / bin

".." verwenden

Relative Pfade können ein oder mehrere Verzeichnisse enthalten. ".." . ".." gibt das übergeordnete Verzeichnis in Bezug auf unser Arbeitsverzeichnis an. Beispiel:

\$ pwd   / usr / local / bin \\ $ cd .. \$ pwd / usr / local

Wie Sie sehen können, das Team cd ..   "hebt uns auf ein höheres Niveau."

Kann hinzufügen ..   zum relativen Pfad. Dadurch können Sie in ein Verzeichnis wechseln, das sich auf derselben Ebene wie das Verzeichnis befindet, in dem wir uns befinden. Beispiel:

\$ pwd   / usr / local \\ $ cd ../share \$ pwd   / usr / share

Beispiele mit relativen Pfaden

Relative Pfade können ziemlich komplex sein. Hier einige Beispiele. Das Ergebnis der Befehle wird nicht angezeigt. Versuchen Sie festzustellen, in welchem ​​Verzeichnis Sie bash verwenden.

\$ cd / bin \$ cd ../usr/share/zoneinfo \$ cd / usr / X11R6 / bin \$ cd ../lib/X11 \$ cd / usr / bin \$ cd ../bin/../bin

Arbeitsverzeichnis "."

Bevor Sie das Gespräch über das Team beenden cdEinige weitere Dinge sollten erwähnt werden. Erstens gibt es ein anderes spezielles Verzeichnis "." was das aktuelle Verzeichnis angibt. Dieses Verzeichnis wird verwendet, um ausführbare Dateien auszuführen, die sich im aktuellen Verzeichnis befinden.

\$ ./myprog

Im letzten Beispiel ist myprog eine ausführbare Datei, die sich im aktuellen Verzeichnis befindet und zur Ausführung gestartet wird.

cD und Home-Verzeichnis des Benutzers

Um in das Home-Verzeichnis zu gelangen, müssen Sie Folgendes eingeben

\$ cd

Verschieben Sie Sie ohne das Argument cd in Ihr Home-Verzeichnis. Für den Superuser lautet das Home-Verzeichnis normalerweise / root und für normale Benutzer / home / Benutzername /. Was aber, wenn wir eine bestimmte Datei angeben möchten, die sich im Heimatverzeichnis befindet? Zum Beispiel als Argument für das Programm. "myprog"? Sie können schreiben:

\$ ./myprog /home/user/myfile.txt

Die Verwendung absoluter Dateipfade ist jedoch nicht immer bequem. Dieselbe Operation kann mit durchgeführt werden ~ –Thilda:

\$ ./myprog ~ / myfile.txt

~   - ein spezieller Name, der das Basisverzeichnis des Benutzers in bash angibt.

Heimatverzeichnisse anderer Benutzer

Was aber, wenn wir eine Datei im Heimatverzeichnis eines anderen Benutzers angeben müssen? Dazu müssen Sie nach der Tilde den Namen dieses Benutzers angeben. Um beispielsweise auf die Datei fredsfile.txt zu verweisen, die sich im Ausgangsverzeichnis des Benutzers fred befindet:

\$ ./myprog ~ fred / fredsfile.txt

Linux-Befehle

Einführung in ls

Sie kennen das Team wahrscheinlich schon. ls, die ohne Argumente aufgerufen wird, zeigt eine Liste der im Arbeitsverzeichnis gespeicherten Dateien an:

\$ cd / usr \$ ls   X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 enthalten libexec portage share tmp distfiles i686-linux info local portage.old src

Wenn Sie eine Option angeben -akönnen Sie alle Dateien anzeigen, einschließlich der verborgenen (deren Namen mit einem Punkt beginnen).

\$ ls -a . bin gentoo-x86 enthalten libexec portage share tmp .. distfiles i686-linux info lokal portage.old src x11R6 doc i686-pc-linux-gnu lib man sbin ssl

Detaillierte Verzeichnisliste

Nach dem Team selbst ls   Sein Argument kann eine oder mehrere Dateien oder Verzeichnisse sein. Wenn Sie den Dateinamen angeben, den Befehl ls   zeigt nur Informationen zu dieser Datei an. Und wenn Sie den Namen des Verzeichnisses angeben, ls   zeigt den gesamten Inhalt. Option "-l"   Mannschaften ls   Dies ist sehr nützlich, wenn Sie neben den Dateinamen (Dateiberechtigungen, Name des Eigentümers, Uhrzeit) weitere Informationen darüber erhalten möchten letzte Änderung   Datei und deren Größe).

Das folgende Beispiel zeigt die Verwendung der Option "-l"   Informationen zu Dateien anzeigen, die im Verzeichnis / usr gespeichert sind

\$ ls -l / usr   drwxr-xr-x 7 wurzel wurzel 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 wurzel 14576 27. dezember 08:56 bin drwxr-xr-x 2 wurzel 8856 26. dezember 12:47 distfiles lrwxrwxrwx 1 wurzel 9 22. Dezember 20:57 doc -\u003e share / doc drwxr-xr-x 62 wurzel 1856 27. dezember 15:54 gentoo-x86 drwxr-xr-x 4 wurzel 152 12. dezember 23:10 i686-linux drwxr-xr-x 4 wurzel 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 wurzel wurzel 5992 Dez 24 22:30 include lrwxrwxrwx 1 wurzel 10 Dez 22 20:57 info -\u003e teilen / info drwxr-xr -x 28 wurzel 13552 26. dezember 00:31 lib drwxr-xr-x 3 wurzel wurzel 72 Nov 25 00:34 libexec drwxr-xr-x 8 wurzel 240 wurzel Dez 22 20:57 local lrwxrwxrwx 1 wurzel 9 Dez 22 20 : 57 man -\u003e share / man lrwxrwxrwx 1 wurzel wurzel 11 8. dezember 07:59 portage -\u003e gentoo-x86 / drwxr-xr-x 60 wurzel 1864 8. dezember 07:55 portage.old drwxr-xr-x 3 wurzel 3096 22 Dezember 20:57 sbin drwxr-xr-x 46 wurzel 1144 24. dezember 15:32 share drwxr-xr-x 8 wurzel 328 26. dezember 00:07 src drwxr-xr-x 6 wurzel 176 24. november 14 14: 25 ssl lrwxrwxrwx 1 wurzel 10 Dez 22 20:57 tmp -\u003e ../var/tmp

Die erste Spalte zeigt die Zugriffsinformationen für jede Datei in der Liste. (Ich werde später erklären, was der Buchstabe bedeutet.) Die nächste Spalte zeigt die Anzahl der Links zu jedem Element in der Liste. Die dritte und vierte Spalte sind der Besitzer bzw. die Gruppe der Datei. Die fünfte Spalte ist die Größe. Der sechste ist der Zeitpunkt der letzten Dateiänderung ("letzte Änderungszeit" oder mtime). Die letzte Spalte enthält den Namen der Datei oder des Verzeichnisses (Wenn dies ein Link ist, dann nach dem " –> "ist der Name des Objekts, auf das es verweist).

So zeigen Sie nur Verzeichnisse an

Manchmal müssen Informationen nur über Verzeichnisse und nicht über deren gesamten Inhalt betrachtet werden. Die Option hilft bei dieser Aufgabe. "-d", der den Befehl anweist, nur Informationen zu Verzeichnissen anzuzeigen. Beispiel:

\$ ls -dl / usr / usr / bin / usr / X11R6 / bin ../share   drwxr-xr-x 4 wurzel 96 Dez 18 18:17 ../share drwxr-xr-x 17 wurzel wurzel 576 Dez 24 09:03 / usr drwxr-xr-x 2 wurzel 3192 Dez 26 12:52 / usr / X11R6 / bin drwxr-xr-x 2-Wurzel 14576 27. Dezember 08:56 / usr / bin

Rekursive Liste und Inode-Informationen

Aktionsoption "-R"   Gegenteil von Aktion "-d". Sie können damit rekursiv Informationen zu Dateien anzeigen, die sich im Verzeichnis befinden. Zuerst wird der Inhalt des obersten Verzeichnisses angezeigt, dann werden die Inhalte aller Unterverzeichnisse nacheinander usw. aufgelistet. Die Ausgabe dieses Befehls kann sehr langwierig sein, daher geben wir ihm kein Beispiel, aber Sie können es selbst tun, indem Sie ihn eingeben befehlszeile "ls -R"oder" ls -ll".

Und schließlich die Option "-i"   Wird verwendet, um Inodes jedes Dateisystemobjekts auszugeben.

\$ ls -i / usr    1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 sim 776 mann 23779 src 43 doc 1386 info 93892 sdc 35737 ssl 70744 784 tmp

Was sind Inoden?

Jedes Dateisystemobjekt (Datei, Verzeichnis ...) hat seine eigene eindeutige Nummer inode   (Inodenummer). Diese Informationen mögen unbedeutend erscheinen, aber das Verständnis der Funktion von Inodes wird Ihnen helfen, viele Vorgänge im Dateisystem zu verstehen. Schauen Sie sich zum Beispiel an "."   und ".."   als Links in jedem Verzeichnis vorhanden. Um zu verstehen, was das Verzeichnis ist ".." finden Sie das Inode-Verzeichnis / use / local

\$ ls -id / usr / local    5120 / usr / local

Wie wir sehen, ist der Inode des Verzeichnisses / usr / local 5120. Nun wollen wir sehen, welches Inode des Verzeichnisses / usr / local / bin / ..

\$ ls -id / usr / local / bin / ..    5120 / usr / local / bin / ..

Es stellt sich heraus, dass die Inodes der Verzeichnisse / usr / local und / usr / local / bin / .. gleich sind! Dies bedeutet, dass sich zwei Namen auf den Inode 5120 beziehen: / usr / local und / usr / local / bin / .. Das sind zwei verschiedene Namen für dasselbe Verzeichnis. Jeder Inode zeigt auf einen bestimmten Speicherplatz.

Jeder Inode kann mehrere Namen von Dateisystemobjekten haben. Die Anzahl der "Synonyme" der Datei (Dateisystemobjekte, die sich auf einen Inode beziehen) zeigt die Anzahl in der zweiten Spalte der Ausgabe des Befehls. " ls -l".

\$ ls -dl / usr / local   drwxr-xr-x 8-Wurzel 240 Dez 22 20:57 / usr / local

Dieses Beispiel zeigt (zweite Spalte), dass das Verzeichnis / usr / local von 8 verschiedenen Dateisystemobjekten referenziert wird. Hier sind ihre Namen:

/ usr / local / usr / local /. / usr / local / bin / .. / usr / local / games / .. / usr / local / lib / .. / usr / local / sbin / .. / usr / local / share / .. / usr / local / src / ..

mkdir

Schauen wir uns den Befehl an mkdir. Es dient dazu, neue Verzeichnisse anzulegen. Das folgende Beispiel zeigt, wie drei neue Verzeichnisse (tic, tac, toe) im Verzeichnis / tmp erstellt werden

\$ cd / tmp $ mkdir tic tac toe

Standardbefehl mkdir   kann keine verschachtelte Verzeichnisstruktur erstellen. Wenn Sie mehrere ineinander verschachtelte Verzeichnisse erstellen müssen ( gewonnen / der / ful), dann müssen Sie diesen Befehl dreimal hintereinander aufrufen:

\$ mkdir gewann / der / ful   mkdir: Verzeichnis kann nicht erstellt werden / der / ful: Keine Datei oder Verzeichnis \\ $ mkdir hat gewonnen \$ mkdir won / der \$ mkdir gewann / der / ful

Sie können diesen Vorgang durch Hinzufügen der Option vereinfachen "-p"   zum Befehl mkdir. Mit dieser Option können Sie eine verschachtelte Verzeichnisstruktur erstellen:

\$ mkdir -p easy / as / pie

Weitere Informationen zu den Funktionen dieses Dienstprogramms finden Sie in der Hilfe, die vom Befehl aufgerufen wird man mkdir. Für fast alle Befehle in dieser Anleitung steht Hilfe zur Verfügung (z. B. mann ls), außer cdweil es ist in bash integriert (für solche Befehle wird help wie folgt aufgerufen: hilfe-CD)

berühren

Gehen wir zu den Studienteams cp   und mvZum Kopieren, Umbenennen und Verschieben von Dateien und Verzeichnissen. Erstellen Sie zuvor jedoch eine leere Datei im Verzeichnis / tmp mit dem Befehl berühren:

\$ cd / tmp \$ berühren Sie copyme

Team berühren   aktualisiert die letzte Dateizugriffszeit (die sechste Spalte der Befehlsausgabe) ls -l) falls bereits vorhanden oder erstellt eine neue leere Datei, falls noch nicht vorhanden. Nach diesem Vorgang sollten wir eine leere Datei haben. / tmp / copyme.

echo

Nun, da wir eine leere Datei haben, schreiben wir die Textzeichenfolge mit dem Befehl hinein echo, die das übergebene Argument an das Standardausgabegerät (in unserem Fall das Textterminal) ausgibt.

\$ echo "firstfile"   Erstdatei

Um einen String in unsere Datei zu schreiben, leiten Sie die Ausgabe des Befehls darauf um. echo:

\$ echo "firstfile"\u003e copyme

Zeichen >   (more) weist die Befehlsshell an, die Ausgabe des Befehls links auf die Datei umzuleiten, deren Name rechts steht. Wenn eine Datei mit diesem Namen nicht vorhanden ist, wird sie automatisch erstellt. Wenn eine solche Datei bereits vorhanden ist, wird sie überschrieben (der gesamte Inhalt wird vor dem Schreiben unserer Zeile gelöscht). Team "ls -l"   zeigt an, dass die Größe unserer Datei jetzt 10 Bytes beträgt - neun Bytes sind mit dem Wort "firstfile" belegt und ein Byte ist ein Newline-Zeichen.

\$ ls -l copyme   -rw-rrr-- 1 wurzel wurzel 10 Dez 28 14:13 copyme

katze und cp

Verwenden Sie den Befehl, um den Inhalt der Datei an das Terminal auszugeben katze:

\$ katze copyme   Erstdatei

Jetzt können wir mit der Analyse der grundlegenden Funktionen des Befehls beginnen. cp. Dieser Befehl benötigt zwei Argumente. Die erste ist der Name einer vorhandenen Datei ("copyme"), die zweite ist der Name der neuen Kopie, die wir erstellen möchten ("copyiedme").

\$ cp copyme copyiedme

Wir können sicherstellen, dass die neue Kopie der Datei eine andere Inode-Nummer hat (dies bedeutet, dass wir eine wirklich neue separate Datei erhalten haben und nicht nur einen Link zur alten).

\$ ls -i copyme copyiedme    648284 kopiertme 650704 copyme

mv

Wenden Sie jetzt den Befehl an mv   um die Datei umzubenennen ("kopiert" -\u003e "bewegt"). Die Inode-Nummer nach diesem Vorgang ändert sich nicht, nur der Dateiname wird geändert.

\$ mv copiedme hat mich bewegt \$ ich bewegte mich    648284 hat mich bewegt

Die Inode-Nummer ändert sich nur dann nicht, wenn die umbenannte Datei innerhalb des Dateisystems verbleibt, in dem sich die Quelldatei befunden hat. Wir werden uns das Dateisystemlayout in einem der folgenden Teile dieses Handbuchs genauer ansehen.

Team mv   erlaubt nicht nur das Umbenennen von Dateien, sondern auch das Verschieben. Zum Beispiel, um eine Datei zu verschieben /var/tmp/myfile.txt   zum Verzeichnis / home / benutzer   brauche den Befehl:

\$ mv /var/tmp/myfile.txt / home / user

Die Datei wird in das Home-Verzeichnis des Benutzers verschoben. benutzer   Auch wenn es sich in einem anderen Dateisystem befindet (in diesem Fall wird die Datei an einen neuen Speicherort kopiert und das Original wird gelöscht). Wie Sie vielleicht schon erraten haben, ändert sich der Inode eines Elements in ein anderes Dateisystem. Dies ist weil jeder dateisystem   hat einen eigenen Satz von Inodes.

Es ist zu beachten, dass die Möglichkeit besteht, dass die neue zugewiesene Inode-Nummer mit der alten übereinstimmt, sie ist jedoch extrem klein.

Um mehrere Dateien gleichzeitig in dasselbe Verzeichnis zu verschieben, schreiben Sie:

\$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt / home / user \$ mv -t / home / user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

Wenn Option hinzufügen "-v"Der Bildschirm zeigt einen Bericht über die Operation an:

\$ mv -vt / home / user /var/tmp/myfile1.txt /var/tmp/myfile2.txt    "/var/tmp/myfile1.txt" -\u003e "/home/user/myfile1.txt" "/var/tmp/myfile2.txt" -\u003e "/home/user/myfile2.txt"

Links erstellen und Dateien löschen

Harte Links

Ich habe das Wort "link" bereits erwähnt, als ich über Verzeichnisse und Inodes sprach. In Linux gibt es zwei Arten von Links. Die erste Art nennt man Hardlinks. Jedem Inode können mehrere feste Verbindungen zugeordnet sein. Es stellt sich also heraus, dass die Datei unter mehreren verschiedenen Namen im System vorhanden ist. Eine Datei ist vorhanden, solange dem Inode mindestens ein Name zugeordnet ist. Die Begriffe "Hard Link to File" und "Dateiname" sind synonym. Neue feste Links zu der Datei können mit dem Befehl erstellt werden l

\$ cd / tmp \$ tippen Sie auf firstlink \$ in der ersten Verbindung zweite Verbindung \$ ls -i firstlink secondlink    15782 erste Verbindung 15782 zweite Verbindung

Wie Sie im Beispiel sehen können, funktionieren Hardlinks auf Inode-Ebene und zeigen auf eine bestimmte Datei. In Linux haben Hardlinks mehrere Einschränkungen. Erstens können Sie feste Links nur zu Dateien und nicht zu Verzeichnissen erstellen. Das ist es, trotz der Tatsache, dass das System feste Links zu Verzeichnissen hat (" . "und" .. ") kann auch der Superuser keine zusätzlichen festen Verknüpfungen zu Verzeichnissen erstellen. Zweitens ist es unmöglich, eine feste Verknüpfung zu einer Datei zu erstellen, die sich in einem anderen Dateisystem befindet, da jedes Dateisystem seinen eigenen eindeutigen Satz von Inodes hat.

Symbolische Links

In der Praxis werden symbolische Links häufiger verwendet (oder symlinks). Ein Symlink ist eine spezielle Art von Datei, die sich auf eine andere Datei mit Namen bezieht und nicht direkt auf den Inode. Simlinks schützen die Datei nicht vor dem Löschen. Wenn die Datei gelöscht wird, wird der Symlink zu ihr inaktiv (oder gebrochen).

Simlinks werden vom Team erstellt l   mit Option "-s":

\$ ls -s secondlink secondlink \$ ls -l firstlink secondlink secondlink   -rw-rw-r-- 2 agriffis agriffis 0 Dez 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dez 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 secondlink -\u003e secondlink

Eine symbolische Verbindung kann an der Befehlsausgabe erkannt werden. ls -lZuerst gibt es in der ersten Spalte von Symlinks einen Buchstaben "l"   (der erste Buchstabe des englischen Wortlinks), zweitens entspricht die Größe des Symlinks der Anzahl der Buchstaben im Dateinamen, auf den er verweist ( "secondlink"   in unserem Fall) Drittens enthält die letzte Spalte neben dem Namen des Links den Namen der Datei, auf die sich das Zeichen bezieht –>

Mehr zu Symlinks

Berücksichtigen Sie die Situation, wenn Sie einen Symlink erstellen möchten, der auf / usr / local / bin verweist und sich im Verzeichnis / tmp / befindet. Wir können schreiben:

\$ ln -s / usr / local / bin bin1 \$ ls -l bin1   lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -\u003e / usr / local / bin \\ $ ln -s ../usr/local/bin bin2 \$ ls -l bin2 lrwxrwxrwx 1 wurzel wurzel 16 Jan 1 15:43 bin2 -\u003e ../usr/local/bin \\ $ ls -l bin2   lrwxrwxrwx 1 wurzel wurzel 16 Jan 1 15:43 bin2 -\u003e ../usr/local/bin \\ $ mkdir mynewdir \$ mv bin2 mynewdir \$ cd mynewdir \$ cD bin2   bash: cd: bin2: Keine solche Datei oder Verzeichnis

Da das Verzeichnis / tmp / usr / local / bin / nicht existiert, können wir das Arbeitsverzeichnis nicht in bin2 ändern. Mit anderen Worten, nach dem Umzug funktionierte der Link nicht mehr (wurde "bat").

Aus diesem Grund sollten Sie manchmal vermeiden, Symlinks mit relativen Pfaden zu erstellen. Aber manchmal ist es bequem. Betrachten Sie den folgenden Fall: Angenommen, wir möchten eine Verknüpfung zu einem Programm in / usr / bin erstellen (oder anders ausgedrückt, geben Sie diesem Programm einen anderen Namen):

# ls -l / usr / bin / keychain   -rwxr-xr-x 1 wurzel wurzel 10150 Dec 12 20:09 / usr / bin / keychain

Der Superuser (root) möchte möglicherweise eine Verknüpfung zum Programm "keychain" mit dem kürzeren Namen "kc" herstellen. In diesem Beispiel haben wir Root-Zugriff auf das System, wie die Bash-Eingabeaufforderung zeigt, die in geändert wurde "#" . Wir benötigen Superuser-Rechte, da normale Benutzer keine Dateien im Verzeichnis / usr / bin / erstellen können. Jetzt können wir als root einen alternativen Namen für unser Programm anlegen:

# cd / usr / bin # ln -s / usr / bin / keychain kc # ls -l keychain   -rwxr-xr-x 1 wurzel wurzel 10150 Dec 12 20:09 / usr / bin / keychain # ls -l kc   lrwxrwxrwx 1 wurzel wurzel 17 Mär 27 17:44 kc -\u003e / usr / bin / keychain

In diesem Beispiel haben wir einen kc-Symlink erstellt, der auf die Datei / usr / bin / keychain verweist.

# mv / usr / bin / keychain / usr / bin / kc / usr / local / bin # ls -l / usr / local / bin / kc   lrwxrwxrwx 1 wurzel wurzel 17 Mär 27 17:44 kc -\u003e / usr / bin / keychain

Da wir beim Erstellen des Links den absoluten Pfad verwendet haben, zeigt er weiterhin auf die Datei / usr / bin / keychain, die nicht mehr vorhanden ist. Wenn wir jedoch den relativen Pfad beim Erstellen des Links verwenden, bleibt er funktionsfähig.

Oft funktionieren beide Arten von Symlinks (mit absoluten und relativen Pfaden) einwandfrei. Das folgende Beispiel zeigt, wie ein Symlink erstellt wird, der nach dem Verschieben und der darauf verweisenden Datei in einem anderen Verzeichnis weiterarbeitet:

# cd / usr / bin # ln -s keychain kc # ls -l kc   lrwxrwxrwx 1 wurzel wurzel 8 Jan 5 12:40 kc -\u003e keychain # mv keychain kc / usr / local / bin # ls -l / usr / local / bin / keychain   -rwxr-xr-x 1 wurzel wurzel 10150 Dec 12 20:09 / usr / local / bin / keychain # ls -l / usr / local / bin / kc   lrwxrwxrwx 1 wurzel wurzel 17 Mär 27 17:44 kc -\u003e schlüsselanhänger

Jetzt können wir das "keychain" -Programm ausführen, indem wir als / usr / local / bin / kc darauf zugreifen

rm

Jetzt wissen wir, wie Teams arbeiten cp, mv   und l   Es ist Zeit zu lernen, wie man Dateien löscht. Normalerweise wird das Entfernen mit dem Befehl ausgeführt rm. Um mehrere Dateien zu löschen, geben Sie einfach ihre Namen durch ein Leerzeichen in der Befehlszeile als Argumente ein rm:

\$ cd / tmp \$ berühren Sie file1 file2 \$ ls -l datei1 datei2   -rw-r - r-- 1 Wurzelwurzel 0 Jan 1 16:41 file1 - rw-r - r-- 1 Wurzelwurzel 0 Jan 1 16:41 file2 \\ $ rm file1 file2 \$ ls -l datei1 datei2   ls: Datei1: keine solche Datei oder Verzeichnis. ls: Datei2: keine solche Datei oder Verzeichnis

Erinnere dich daran gelöschte Dateien   unmöglich wiederherzustellen (obwohl Sie es versuchen können) Daher verwenden viele Linux-Neulinge die Option "-i"   Mannschaften rmDazu müssen Sie den Benutzer bitten, das Löschen jeder Datei zu bestätigen.

\$ rm -i datei1 datei2   rm: normale leere Datei `file1" entfernen? y   rm: Regelmäßige leere Datei `file2" entfernen? y

Im letzten Beispiel vor dem Löschen jeder Datei der Befehl rm   fragt: Will der Benutzer die Datei wirklich löschen? Um den Löschvorgang zu bestätigen, drücken Sie die Taste "y"   auf der Tastatur und die Löschtaste ablehnen "n".

Sie können die Ausführung eines Befehls unterbrechen (wenn etwas wie beabsichtigt schief ging), indem Sie die Kombination drücken CtrlC.

Bitten Sie den Befehl rm um Bestätigung, dass jede Datei auch ohne die Option gelöscht werden soll "-i"   kann der Datei hinzugefügt werden ~ / .bashrc   Verwenden Sie Ihre bevorzugte Texteditorzeile:

alias ​​rm = "rm -i"

rmdir

Es gibt zwei Möglichkeiten, Verzeichnisse zu löschen: Sie können den gesamten Inhalt des Verzeichnisses nacheinander löschen und dann den Befehl verwenden rmdir   um das Verzeichnis selbst zu löschen:

\$ mkdir mydir \$ tippen Sie auf mydir / file1 \$ rm mydir / file1 \$ rmdir mydir

Diese Methode wird allgemein als "Methode zum Löschen von Verzeichnissen für Verlierer" bezeichnet. Es ist viel bequemer, den Befehl zu verwenden "rm -rf"   das Verzeichnis mit seinem gesamten Inhalt löschen.

\$ rm -rf mydir

Verwenden Sie diesen Befehl mit Vorsicht, denn mit seiner Hilfe ist es für unerfahrene Administratoren (insbesondere mit Root-Rechten) sehr leicht, Holz (und Linux-Systeme) zu brechen.

Verwenden Sie Platzhalter

Was ist Platzhalter?

Bei der täglichen Verwendung von Linux gibt es oft Situationen, in denen Sie eine einfache Operation (z. B. rm) für viele Dateien ausführen müssen. In diesem Fall ist es nicht sehr praktisch, alle Dateinamen in der Befehlszeile aufzulisten:

\$ rm Datei1 Datei2 Datei3 Datei4 Datei5 Datei6 Datei7 Datei8

Dieses Problem kann mit Platzhaltern gelöst werden. Der Linux-Befehlsinterpreter unterstützt die Möglichkeit, mehrere Dateien mithilfe von Vorlagen anzugeben (aus historischen Gründen wird dies auch als "Globbing" bezeichnet). Bash und andere Linux-Befehle wählen nur die Dateien aus, die dem Muster entsprechen. Wenn Sie also Dateien von Datei1 bis Datei8 löschen müssen, müssen Sie Folgendes schreiben:

\$ rM-Datei

Und wenn Sie alle Dateien löschen möchten, deren Namen mit der Wortdatei und einer Datei namens Datei beginnen:

\$ rm datei *

Muster *   entspricht einem beliebigen Zeichen, einer Folge von Zeichen oder "kein Zeichen". Natürlich können Vorlagen nicht nur zum Löschen von Dateien verwendet werden, wie unten gezeigt wird.

Wenn keine Übereinstimmung gefunden wird

Wenn Sie eine Liste der Dateien im Verzeichnis / etc / anzeigen möchten, deren Namen mit dem Buchstaben beginnen "g"   und eine Datei mit dem Namen "g" (falls vorhanden), müssen Sie schreiben:

\$ ls -d / etc / g *   / etc / gconf / etc / ggi / etc / gimp / etc / gnome / etc / gnome-vfs-mime-magic / etc / gpm / etc / group / etc / group-

Sehen wir uns an, was passiert, wenn Sie eine Vorlage angeben, die keinem Dateinamen entspricht:

\$ ls -d / usr / bin / asdf * jkl   ls: / usr / bin / asdf * jkl: Keine solche Datei oder Verzeichnis

In diesem Beispiel haben wir versucht, eine Liste von Dateien anzuzeigen, deren Namen mit "asdf" beginnen und mit "jkl" enden. Der Befehlsinterpreter gab eine Nachricht aus, dass keine Dateien mit solchen Namen gefunden wurden.

Vorlagensyntax: * und?

Wir haben nachgesehen, wie das Globing funktioniert (Dateinamenerweiterung). Und nun wollen wir uns die Syntax von Templates genauer ansehen:

*   entspricht null oder mehr Zeichen:

  • / etc / g *   - alle Dateien im Verzeichnis / etc /, deren Namen mit "g" und einer Datei mit dem Namen "g" beginnen.
  • / tmp / mein * 1   - alle Dateien im Verzeichnis / tmp, deren Namen mit "my" beginnen und mit "1" enden (einschließlich der Datei "my1")

?   ersetzt ein einzelnes Zeichen:

  • meine datei   - jede Datei, deren Name mit dem Wort "myfile" beginnt, gefolgt von einem beliebigen Zeichen.
  • / tmp / notes? txt   - vergleicht Dateien mit den Namen "notes.txt" und "notes_txt" (sofern sie in / tmp / vorhanden sind).

Eckige Klammern:

Das "" Muster ist sehr ähnlich zu "" ? msgstr "Sie können jedoch explizit eine Gruppe von Zeichen angeben." "Das Muster" "stimmt mit einem Zeichen überein, das in Klammern angegeben ist. Sie können auch einen Bereich von Zeichen in Klammern angeben (dazu verwenden Sie das - / Bindestrich) oder mehrere Bereiche in einer Zeile Symbol aus diesem Bereich:

  • meine datei   - entspricht myfile1 und myfile2. Die Vorlage funktioniert, solange mindestens eine dieser beiden Dateien vorhanden ist.
  • hangeog   - vergleicht Dateien mit den Namen Changelog, ChangeLog, ChangeLog und Changelog. Wie Sie sehen, ist die Verwendung eines Musters hilfreich, wenn Sie nach Namen suchen, die sich von Fall zu Fall unterscheiden.
  • ls / etc / *   - listen Sie die Dateien im Verzeichnis / etc / auf, deren Namen mit einer Ziffer beginnen.
  • ls / tmp / *   - Liste der Dateien im Verzeichnis / tmp /, deren Namen mit einem Buchstaben beginnen (Groß- oder Großbuchstaben)

Das Konstrukt [ist ähnlich, außer dass es einem einzelnen Zeichen entspricht, das nicht dazwischen steht [[   und ] . Zum Beispiel:

  • rm myfile [   - löscht alle Dateien, deren Namen aus dem Wort "myfile" und der darauf folgenden Ziffer bestehen, mit Ausnahme der Datei "myfile9".

Anwendungsbeispiele

Hier einige Beispiele für die Verwendung von Vorlagen. Da interpretiert bash Zeichen ? , [ , ] , *   Bei der Verwendung von Argumenten, die diese Zeichen enthalten, ist als Ersatzmuster Vorsicht geboten. Wenn Sie beispielsweise eine Datei erstellen möchten, die die Zeichenfolge " * "Dann wird der folgende Befehl nicht das tun, was Sie wollen:

\$ echo *\u003e /tmp/mynewfile.txt

Wenn sich in Ihrem Arbeitsverzeichnis eine oder mehrere Dateien befinden, deren Namen unter das Muster fallen " * "dann finden Sie in /tmp/mynewfile.txt eine Liste ihrer Namen, keine Zeichenfolge" * "Aber wie können wir erreichen, was wir wollten? Die erste Möglichkeit besteht darin, eine Zeichenfolge in einfache Anführungszeichen zu nehmen. Bash bezieht sich auf eine Zeichenfolge in einfachen Anführungszeichen als reguläre Textzeichenfolge und zeigt keine Ersatzzeichen an.

\$ echo "*"\u003e /tmp/mynewfile.txt

Nach der Ausführung dieses Befehls enthält Ihre Datei die Zeichenfolge " * "wie erwartet. Eine andere Möglichkeit besteht darin, Sonderzeichen mit einem Backslash ( \ ). Ein Backslash, der vor dem Sonderzeichen steht, informiert den Interpreter, dass dieses Zeichen als Text und nicht als Vorlage behandelt werden sollte.

\$ echo \\\\ *\u003e /tmp/mynewfile.txt

Beide vorgeschlagenen Methoden (einfache Anführungszeichen und Abschirmung) liefern das gewünschte Ergebnis. Da es sich um einen Fluchtweg mit einem Backslash handelt, ist es sinnvoll, dies als Textzeichen anzuzeigen "\"   Sie können es in einfache Anführungszeichen setzen oder schreiben "\\\"   (Diese Kombination wird vom Interpreter als regulärer Backslash interpretiert "\" )

HinweisDoppelte Anführungszeichen funktionieren ähnlich wie einfache Anführungszeichen. Bashs können jedoch einige Sonderzeichen interpretieren. Daher sind einfache Anführungszeichen der beste Weg, um nur Text an einen Befehl zu übergeben. Weitere Informationen zu Vorlagen finden Sie in der Hilfe. "man 7 glob". Weitere Informationen zur Verwendung von Anführungszeichen finden Sie in diesem Abschnitt. Zitat   Hilfe "mann 8 glob".

Fazit

Herzlichen Glückwunsch, Sie sind zum Ende unserer Überprüfung der Grundlagen von Linux gekommen! Ich hoffe das Material war für Sie nützlich. In diesem Lernprogramm behandelte Themen, einschließlich der Grundlagen von bash, basic linux-Befehle, Links und Platzhalter bilden die Grundlage für den nächsten Artikel zu den Grundlagen der Verwaltung, der reguläre Ausdrücke, Zugriffsrechte, Benutzerkontenverwaltung und vieles mehr umfasst.

Fortsetzung des Themas:
Smartphone

Es scheint immer noch, dass Android 4.4 KitKat eine neue Version des Systems ist, aber erinnern wir uns daran, dass der vier bereits im Herbst 2013 eingeführt wurde! Während dieser ganzen Zeit ist es passiert ...