Bewährte Methoden und Tipps für die Linux-Befehlszeile?


112

Ich möchte eine Diskussion eröffnen, in der Best Practices und Tipps für Ihre Linux-Befehlszeile (CLI) zusammengefasst werden.

Ich habe nach einer solchen Diskussion gesucht, um den folgenden Kommentar zu teilen, habe aber keinen gefunden, daher dieser Beitrag.

Ich hoffe, wir alle konnten daraus lernen.

Sie sind herzlich eingeladen, Ihre Bash-Tipps, grep, sed, AWK, / proc und alle anderen verwandten Best Practices für die Linux / Unix-Systemadministration und Shell-Programmierung zum Nutzen von uns allen mitzuteilen.


Warum nur Linux? Viele Tipps können für fast alle Unix-Varianten nützlich sein.
mouviciel

Diese Frage könnte ein bisschen weit gefasst sein - es gibt genug Best Practices für die Linux / Unix-Befehlszeile, um ganze Bücher zu füllen ...
Jonik

Ich bin damit einverstanden, dass Unix-Tipps, die auch auf Linux angewendet werden können, sehr willkommen sind. Ich habe Linux geschrieben, weil A. Damit arbeiten wir hier. B. weil es in der Öffentlichkeit mehr Beachtung findet als Unix in den letzten Jahren.
Maxim Veksler

Ich halte es für eine großartige Idee, eine Liste der nützlichsten und interessantesten Befehle zu erstellen, die die Leute verwenden.

Sind einige von diesen relevant? refspecs.freestandards.org

Antworten:


111

Verwenden Sie screen , einen freien Terminal-Multiplexer, der vom GNU-Projekt entwickelt wurde und es Ihnen ermöglicht, mehrere Terminals in einem zu haben.

Sie können eine Sitzung starten und Ihre Terminals werden gespeichert, auch wenn die Verbindung unterbrochen wird, sodass Sie später oder von zu Hause aus weitermachen können.


2
Die am häufigsten verwendeten Schalter sind "screen -D -R" zum Trennen und Fortsetzen der letzten Bildschirmsitzung und "screen -x" zum Anzeigen derselben Bildschirmsitzung über mehrere Anmeldungen. Holen Sie sich auch eine schöne .screenrc von dotfiles.org/.screenrc
Nick Devereaux

4
Eine weitere nette Sache bei screen ist, dass Sie ein Terminal mit anderen Leuten teilen können, wenn Sie an etwas zusammenarbeiten möchten, indem Sie screen -x
gareth_bowles verwenden.

101

SSH!
SSH ist der Befehl Gottes - ich denke, es ist der wertvollste Befehl, den man lernen kann. Die Optionen können ziemlich entmutigend sein, aber es scheint, als würde ich ständig lernen, neue Befehlszeilenoptionen für SSH zu verwenden, die ich nie für notwendig gehalten hätte. Vielleicht habe ich sie zu diesem Zeitpunkt alle benutzt.

Je mehr Sie es verwenden, desto mehr lernen Sie darüber. Sie können es verwenden, um einige erstaunliche Dinge zu tun.

Hinweis: ALLE diese Dinge können per Fernzugriff ohne Einrichtung auf Ihrem Server ausgeführt werden, es sei denn, der SSH-Server läuft.

Hängen Sie ein Dateisystem über das Internet ein

Durchsuchen Sie das Netz nach SSHFS

Befehle weiterleiten .

Das SVN + SSH-Protokoll ist Subversion von einem Remote-Client zu einem Server, auf dem NO DEAMON ausgeführt wird! Der SVN-Befehl startet den Server über die ssh-Shell und leitet die Informationen über die vorhandene Pipe hin und her. Das rsync-Programm führt dasselbe aus: Es wird auf einem Server ohne rsync-Deamon ausgeführt, indem es selbst über SSH gestartet wird. Es ist einfach, eigene Bash-Dateien zu schreiben, um ähnliche Tricks auszuführen.

Kette um durch Firewalls zu kommen

Ich benutze dies die ganze Zeit, um von meinem Linux-Server zu Hause zu meinem Mac zu springen.

Forward-Ports:
Scheint nur mäßig nützlich zu sein, bis Sie feststellen, dass Sie von zu Hause aus über Ihre Heim-Firewall springen und Ihren Router so konfigurieren können, als würden Sie dies von Ihrem Heimnetzwerk aus tun.

X-Anfragen weiterleiten:

Dies ist ein weiterer erstaunlicher. Mit oder ohne einen X-Server, der auf Ihrem Remote-System ausgeführt wird, können Sie ein x-windows-Programm ausführen, und das Fenster wird auf Ihrem lokalen Bildschirm angezeigt. Benutze einfach den Schalter -X, das ist alles!

Da auf Ihrem Remote-Server kein X-Server ausgeführt werden muss, ist die CPU-Belastung auf Ihrem Server minimal. Sie können einen TINY Linux-Server verwenden, der auf Ihrem leistungsstarken Spiel-PC mit Windows und Cygwin / X riesige Apps bereitstellt.

Natürlich funktionieren VI und EMACS über SSH, aber wenn ich zu Hause laufe, möchte ich manchmal mehr. Ich benutze ssh -X, um eine Kopie von Eclipse zu starten! Wenn Ihr Server leistungsstärker ist als Ihr Laptop, befindet sich die grafische Benutzeroberfläche direkt auf Ihrem Laptop. Die Kompilierung wird jedoch auf Ihrem Server ausgeführt. Sorgen Sie sich also nicht um die Systemlast.

In Batch-Dateien ausführen

(was bedeutet, dass Sie eine lokale Batch-Datei ausführen, die auf anderen Systemen "Sachen macht"):

Zwei Dinge verbinden sich, um dieses cool zu machen. Zum einen können Sie Passwortabfragen mit (sichereren) Verschlüsselungsschlüsseln umgehen. Der zweite ist, dass Sie einen Befehl in der SSH-CLI angeben können. Ich habe dies auf einige interessante Arten verwendet: Wenn eine Kompilierung auf dem Remote-Server fehlschlägt, würde ich sie über SSH auf meinem Computer speichern und eine Sounddatei abspielen.

Denken Sie daran, dass Sie die Ausgabe des Remote-Befehls umleiten und in Ihrer lokalen Batch-Datei verwenden können, sodass Sie möglicherweise auch eine auf Ihrem Server ausgeführte Kompilierung lokal überwachen können.

Eingebaut in Mac

Sowohl Server als auch Client sind in Mac und Linux integriert. Im Falle von Mac und Ubuntu ist das Aktivieren eines Servers so einfach wie das Finden des richtigen Kontrollkästchens.

Auf einem PC Cygwin oder Cygwin / X installieren (Mit Cygwin / X können Sie Ihre X-Window-Ausgabe von Ihrem Linux-Computer auf Ihren Windows-PC weiterleiten - es installiert einen X-Server)

Wichtige Tipps / Konfigurationsdatei

Verwenden Sie niemals Port 22 in Ihrer Firewall. Sie werden eine Menge Hackversuche bekommen, es lohnt sich einfach nicht. Lassen Sie Ihre Firewall einfach einen anderen Port an Ihren Server weiterleiten.

Es gibt umfangreiche Konfigurationsoptionen, mit denen Sie Ihre ssh-Befehle erheblich vereinfachen können. Hier ist ein Beispiel von mir bei der Arbeit:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Wenn ich "ssh home" eingebe (sonst nichts), verhält es sich so, als hätte ich Folgendes eingegeben:

ssh -p 12345 bill@billshome.hopto.org

und leitet dann meinen lokalen Port 1025 an mein System "mac" zu Hause weiter. Der Grund dafür ist, dass ich einen anderen Eintrag in meiner Datei habe:

Host mac
    hostname localhost
    port=1025

Wenn ich ein "ssh home" gemacht habe und das Fenster noch geöffnet ist, kann ich "ssh mac" eingeben, und der hier arbeitende Computer versucht tatsächlich, eine Verbindung zu seinem eigenen Port 1025 herzustellen, der an "mac" weitergeleitet wurde: 22 "über den anderen Befehl, damit er zu Hause über die Firewall eine Verbindung zu meinem Mac herstellt.

Bearbeiten - cooles Skript!

Ich habe ein altes Drehbuch ausgegraben, das ich einfach liebe - musste zurückkommen und es für jeden hier posten, der interessiert sein könnte. Das Skript heißt "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Wenn Sie dieses Skript in Ihrem Home-Verzeichnis haben und einen Host haben, zu dem Sie eine Verbindung herstellen können (über ssh), können Sie "./authMe hostName" eingeben.

Bei Bedarf wird ein öffentliches / privates Schlüsselpaar für Sie erstellt, dann wird ssh auf den anderen Computer übertragen und Ihr öffentlicher Schlüssel kopiert (der Befehl ssh fordert Sie zur Eingabe eines Kennworts auf ...).

Danach sollte der SSH-Befehl nicht mehr nach Ihrem Kennwort fragen, wenn Sie eine Verbindung zu diesem Remote-System herstellen. Er verwendet das öffentliche / private Schlüsselpaar.

Wenn Ihr Remotecomputer nicht immer sicher ist, sollten Sie nach Aufforderung eine Passphrase festlegen.

Möglicherweise möchten Sie auch den SSH-Server am anderen Ende so konfigurieren, dass aus Sicherheitsgründen keine Textkennwörter (nur Schlüssel) zugelassen werden.


4
+1 sehr schöne und kompakte Post
Karsten

2
Ein kleiner Hinweis zu SSH über Port 22: Vorausgesetzt, Sie haben ein gutes Root-Passwort und Ihre Benutzer haben keine schrecklichen Passwörter, reicht es aus, nur fail2ban (oder ähnliches) auszuführen, um Crack-Versuche abzuwehren. Ich fand es wirklich ärgerlich, SSH auf einem anderen Port zu belassen.
David Wolever

1
Es kann manchmal irritierend sein, aber das Volumen der Verbindungen war nur beängstigend. Ich weiß, dass sie nicht durchkommen sollen, aber es ist so, als ob Sie jemanden hätten, der jede Minute zu Ihrem Haus geht und mit Ihrem Türknauf spielt - nur nervtötend.

Heutzutage gibt es in den meisten ssh-Versionen eine integrierte Version Ihres letzten Befehls. Sie heißt ssh-copy-idund ist so einfach wiessh-copy-id user@someserver
JamesHannah 20.10.09

Eine andere Möglichkeit, Ihren 'ssh mac'-Trick auszuführen, besteht darin, eine ProxyCommand-Direktive in Ihrer .ssh / config-Datei zu verwenden. Host mac ProxyCommand ssh -q home "nc% h% p" Hiermit wird netcat (nc) zu Hause ausgeführt und Ihre ssh-Verbindung direkt zu mac umgeleitet. Ich finde diese einfacher zu verketten (zum Beispiel, wenn Sie eine Verbindung zu "Zuhause" herstellen müssen, um zu "Bastion" zu gelangen, um zu "Webserver" zu gelangen.
toppledwagon 20.10.09

73

Ich benutze gerne

cd -

um zum vorherigen Verzeichnis zu wechseln. Sehr hilfreich!


6
Ich habe das nie gewusst! Vielen Dank! In einem ähnlichen Zusammenhang tun pushd und popd etwas Ähnliches, indem sie einen Stapel von dirs aufbauen. Diese Art von Tricks helfen beim Navigieren in einer tiefen Verzeichnisstruktur.

Das ist pure Erleuchtung.
Manuel Ferreria

69

Ich habe vor kurzem den pvBefehl (Pipe Viewer) entdeckt, der wie cat ist, aber Übertragungsdetails enthält.

Also statt

$ gzip -c access.log > access.log.gz

Sie können verwenden

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Anstatt also keine Ahnung zu haben, wann Ihre Operation beendet sein wird, wissen Sie es jetzt!

Mit freundlicher Genehmigung von Peteris Krumins


$ gzip -c access.log> access.log.gz Warum nicht einfach: $ gzip access.log

Oh, das funktioniert :) Ich habe gerade das Beispiel von Peteris 'Website genommen.
Nick Devereaux

Das sieht gut aus, alt tee(1).
Daniel C. Sobral

Extrem nützliches Dienstprogramm, eines, das ich immer vergesse :-(
Patrick


46

Drücken Sie Strg-R und geben Sie einen Befehl (oder einen Teil davon) ein - es durchsucht den Befehlsverlauf. Wenn Sie erneut die Strg-R-Taste drücken, wird zum nächsten Treffer gesprungen und der aktuell angezeigte Befehl ausgeführt. Mit dem Rechtspfeil (mindestens) können Sie ihn zuerst bearbeiten.

$ (reverse-i-search)`svn': svn status

Ich hatte Linux 7 Jahre lang als mein Hauptbetriebssystem verwendet, bevor ich davon erfuhr, aber jetzt, da ich es kenne, ist es recht praktisch.


Vielen Dank. Ich habe die Rückwärtssuche verwendet, konnte aber nicht herausfinden, wie ich zum nächsten Spiel springen kann.
Adam

Strg-S springt zum nächsten Treffer. Möglicherweise müssen Sie stty -ixonzuerst die XON / XOFF-Flusskontrollbedeutung ausschalten (dies macht auch Strg-Q verfügbar, standardmäßig entspricht es dem in Anführungszeichen gesetzten Strg-V-Einfügen, Sie können es jedoch auch in etwas anderes ändern ). Siehe man sttyund man readlinefür weitere Informationen. Der sttyBefehl kann zu Ihrem Befehl hinzugefügt werden~/.bashrc
Dennis Williamson

45

Die Kommandozeile ist eine lustige Sache. Ich denke, dass Sie nur so viel alleine lernen können und den Rest lernen Sie zufällig, wenn Sie jemand anderem über eine Befehlszeile zuschauen.

Ich habe die Shell jahrelang benutzt, um Verzeichnisnamen mühsam von Hand einzugeben. Eines Tages beobachtete ich, wie ein Freund auf einem System herumspielte und drückte die Tabulatortaste. Ich fragte "warum schlägst du Tab?". Antwort: Es wird versucht, das Verzeichnis oder den Dateinamen zu vervollständigen. Wer hätte das gedacht - Tab-Vervollständigung! Geben Sie einen Teil der Datei oder des Verzeichnisses ein, drücken Sie die Tabulatortaste, und es wird versucht, die Eingabe zu beenden (das Verhalten hängt jedoch von der Shell ab).

Eines Tages beobachtete mich ein Freund auf der Kommandozeile und sah zu, wie ich etwas eintippte wie:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Wer hätte das gedacht? Er wusste nie über popd/ pushd. Vermutlich sind wir sogar ...


1
Für mich scheint die Tab-Vervollständigung etwas "offensichtliches" zu sein, sehr grundlegend, aber ich wusste auch nichts über Popd / Pushd. Komisch in der Tat. :)
Jonik

3
Sehen Sie sich auch diese Antwort an, um in der Lage zu sein, wesentlich mehr als Befehle, Dateien und Verzeichnisse per
Jonik

1
Das ist wirklich wahr. Ich habe etwas über Bashs Rückwärtssuche (Strg-R) gelernt, indem ich jemanden beobachtet habe. Ich erkannte später, dass es sich um eine Readline-Funktion handelte und arbeitete in anderen Programmen, die Readline enthalten (MySQL, GDB, Python -i, Clisp usw.), genauso.
Sigjuice

2
Wie können Sie "die Shell" jahrelang nutzen und wissen nicht, wie die Registerkarten vervollständigt werden?
Prestomation

Vergessen Sie beim Umgang mit pushd / popd nicht, die Befehlsverzeichnisse zu erwähnen . Es zeigt, was sich auf dem pushd / popd-Stack befindet.
Slm

41

Lerne Vim.

Es ist (wohl) der beste Editor, aber mit Sicherheit der beste Editor, der auf einem reinen Linux-Server verfügbar ist.


1
gvim ist auch am besten Dateibrowser unter Windows;)

Dies ist auch äußerst nützlich, da Sie, sobald Sie vim kennen, die meisten Shells in den vi-Modus versetzen können und die Navigation extrem einfach und schnell wird
Patrick,

38

Es ist manchmal nützlich, ein Programm laufen zu lassen, auch wenn Sie sich abgemeldet haben. Ich habe einige Lösungen gesehen, die zu diesem Zweck nohup oder sogar screen verwenden. Das einfachste, das ich kenne, ist:

$ your_command_here & disown

Sie können auch ein laufendes Programm trennen:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
Die Verwendung des Bildschirms ist großartig, da Sie später von überall aus eine neue Verbindung zu dieser App herstellen können.
Prestomation

+1, ich hatte noch nichts von Verleugnung gehört.
user18911

Das gleiche gilt auch für den Bildschirm
Andy,

38

Wenn ich sicherstellen möchte, dass ich einen tatsächlichen Befehl und keinen Alias ​​verwende, verwende ich einen führenden Backslash:

\rm -rf ~/tmp

Ist dies dasselbe wie "Befehl rm -rf ~ / tmp"?
Maxim Veksler

Ich wusste nicht, "Befehl", aber es sieht genauso aus.
mouviciel

4
Nun ja, es sei denn, der "Befehl" ist kein Alias. In diesem Fall müsste \ rm -rf ~ / tmp verwendet werden. \ Rm -rf ~ / tmp ist besser
Jamol

@presario und du denkst das wäre möglich einen Alias ​​für "/" zu machen? Schade, dass ich den Kommentaren nicht zustimmen kann :)

Siehe auch den ähnlichen Befehl " builtin".
Dennis Williamson

38

Dieser Tipp macht Ihre CLI komfortabler (zumindest für mich):

erstelle ~ / .inputrc Datei mit folgendem Inhalt:

"\e[A": history-search-backward
"\e[B": history-search-forward

Laden Sie die Bash neu (z. B. indem Sie "exec bash" eingeben). Wenn Sie ein Präfix eines Befehls eingeben und den Aufwärtspfeil drücken, durchsuchen Sie Befehle, die mit Ihrem Präfix beginnen. Wenn Sie beispielsweise ssh eingeben, werden Ihre früheren Verbindungen mit Remote-Shells angezeigt. Wenn Ihre Eingabeaufforderung leer ist, durchsucht der Aufwärtspfeil den Verlauf wie gewohnt.


3
Normalerweise binde ich diese an \ e [5 ~ und \ e [6 ~ (alias pageup und pagedown), anstatt die Pfeile neu zu binden, aber es ist praktischer als Strg-R / Strg-S :)
ephemient

+1. Ich habe diese an F8 und Shift-F8 gebunden, um cmd.exe nachzuahmen, aber das gleiche Prinzip gilt.
user18911

4
+1 fürexec bash
Dennis Williamson

Es ist auch lehrreich, man readlinedie Standardverknüpfungen zu lesen und auswendig zu lernen
SaveTheRbtz

Sie können bind -f ~/.inputrcden inputrc auch neu laden, ohne eine neue Bash starten und Ihre aktuelle Umgebung löschen zu müssen.
Patrick

36

Verwenden Sie diese &&Option, ;wenn Sie mehrere Befehle gleichzeitig ausführen. Es stoppt, wenn ein Fehler auftritt und führt die anderen Befehle nicht aus.

Klassisches Beispiel:

./configure && make && make install

1
Diese Praxis wird so unterschätzt! Es sollte üblich sein, jede Zeile eines Shell-Skripts mit && zu beenden und "true" als letzten Befehl zu verwenden.
user18911

3
lustig ist, dass ich nichts über das ';' wusste Befehl vor - ich hatte IMMER '&&' verwendet.
Nick Klauer

4
Sie können Shell-Skripte mit "#! / Bin / sh -e" starten. Dies stoppt, wenn eine Leitung ausfällt.
Stribika

3
Sie können eine doppelte Pipe für die "else" -Klausel verwenden:dosomething && echo "success" || echo "teh fail"
Dennis Williamson

2
Es gab kürzlich einen Hinweis auf Planet Debian, dass es eine schlechte Praxis ist, das -e in der Shebang-Zeile zu verwenden. Verwenden Sie stattdessen set -e im Hauptteil des Skripts. Auf diese Weise funktioniert das Skript nicht anders, wenn zufällig jemand mit sh $ filename einläuft.
ptman

32

Wenn ich in bash Schleifen in die Befehlszeile schreibe, stelle ich riskanten Befehlen häufig den Befehl 'echo' voran.

for item in items; do echo something-risky; done

Auf diese Weise kann ich das "etwas Gefährliche" vollständig erkennen, bevor ich mich dazu entscheide, es auszuführen. Hilft, wenn Ihr riskantes Kommando variable Erweiterungen und Globs enthält. Und 'set -x' ist sehr nützlich, wenn Sie Bash-Skripte schreiben.

'set -x' aktiviert das Debuggen. Informationen zum Bash-Debugging finden Sie unter http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html .


3
Das mache ich auch, sehr praktischer Trick!
user18911

1
+1 Das kann ein Lebensretter sein! oder Datenretter ...
David Oneill

31

Anforderung

Sie müssen die maximale Bandbreite zwischen zwei Servern testen.


Lösung

Auf SERVER1 machen Sie:

nc -u -l 54321 > /dev/null

Auf SERVER2 machen Sie:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Sie sehen Ausgaben wie:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

Hier ist 117 MB / s der interessante Faktor, der die tatsächliche Netzwerkübertragungsbandbreite angibt.

Erklärung :

Sobald das Paket über das Netzwerk übertragen wird, können Sie Bandbreitenstatistiken für SERVER2 anzeigen. Dies ist eine ziemlich gute Schätzung der tatsächlich maximal möglichen Bandbreite zwischen den beiden Servern.

Kopieren mit UDP (um TCP-Overhead zu vermeiden).

Kopieren vom Speicher (/ dev / zero) auf SERVER1 in den Speicher (/ dev / null) auf SERVER2, um zu verhindern, dass die Datenträger-E / A zum Engpass wird.


4
Stellen Sie jedoch sicher, dass ssh nicht für die Verwendung der Komprimierung in .ssh / config konfiguriert ist. Ansonsten bekommst du wirklich nette Zahlen, die sehr weit von der Wahrheit entfernt sind ;-)
Joachim Sauer

Lol ja. Und SSH wird Ihre CPU verschlüsseln und entschlüsseln, was auch die Zahlen runterwirft.

benutze stattdessen netcat
bendin

+1 für Netcat. Der Overhead von SSH wird Ihre Zahlen
verzerren

Überarbeitet, um Vorschläge von @saua, @Daniel Von Fange und @bendin zu ändern. Vielen Dank für Ihre Vorschläge Jungs.
Maxim Veksler

23

Das Anzeigen von Farbverzeichnisstrukturen ist einfacher.

alias ls="ls --color=tty"

Bearbeiten

alias ls="ls --color=auto"

5
Ich bevorzuge --color = auto, weil es keine Müllsteuerzeichen sendet, wenn es in eine Datei umgeleitet wird. Sie können auch alias grep = "grep --color = auto" verwenden, um übereinstimmende Muster hervorzuheben.

+1 für --color = auto; könnte jemand die Antwort damit ergänzen?
Jonik

Ich denke, tty macht hier das Gleiche wie auto.
Joshudson

Aktualisiert, um die Farbe zu reflektieren = auto
Suroot

Seltsamerweise macht die Färbung die Dinge für mich viel weniger lesbar. Zum Beispiel ist Gelb auf Weiß keine gute Farbwahl.

20

Einige kleine Hinweise zur Protokollanzeige:

  1. Sie können tail -F verwenden , um das Protokoll zu überwachen , nachdem es abgeschnitten wurde (Beispiel: log4j).
  2. Sie können weniger verwenden: Öffnen Sie weniger und klicken Sie auf UMSCHALT + F , um das Endverhalten zu emulieren. Eine weitere nützliche Kombination ist -S , um den Zeilenumbruch zu deaktivieren. Mit weniger können Sie in den Protokollen suchen.

1
Und mit können tail -fSie mehrere Protokolle gleichzeitig ansehen! ZB:tail -f log1.txt -f log2.txt
Stu Thompson

@StuThompson: Danke. wusste das nicht. Darüber hinaus möchten Sie vielleicht vanheusden.com/multitail
Maxim Veksler

20

Ich habe vor langer Zeit von einem Freund einen Trick gelernt , um die Dateierweiterung einfach zu ändern:

mv my_filename.{old,new}

Die Shell-Erweiterung erweitert dies auf:

mv my_filename.old my_filename.new

Dies kann auch verwendet werden, um eine Datei auf andere Weise umzubenennen, z. B .:

mv my_{,cool_}filename

6
Stellen Sie nur sicher, dass Sie keine Platzhalter oder andere Musterausdrücke in denselben Befehl einfügen, da der Glob sonst auf mehr als nur 2 Argumente erweitert werden kann! mv *. {alt, neu} wird wahrscheinlich wirklich überraschende Ergebnisse liefern.

Ja, einverstanden - das ist eine wichtige Einschränkung :)

2
Sie können zum Beispiel auch ls -l /bin/cAlt-Shift- {drücken, um die Eingabe zu vervollständigen ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}.
Dennis Williamson

19

Verwenden Sie "tar xf", um komprimierte Archive zu extrahieren. Das j für bzip2 und das z für gzip sind nicht erforderlich, da tar den Dateityp Ihres Archivs erkennt. Weder steht '-' vor Argumenten. Sie sparen viel Zeit (über ein Jahrtausend ;-)).

Besser noch unfoo verwenden , um ein Archiv mit einem einzigen Befehl ohne unnötige Argumente zu extrahieren.


Ja, ich habe alias ut="tar xf"- macht das Extrahieren von Archiven noch einfacher.
David Wolever

Dies schlägt bei einigen RHEL-Distributionen fehl, wenn Sie sie verwenden.
pvsnp

Der neue Teer hat auch "J" -Schalter zum Komprimieren auf xz (7zip-basierte) Archive
Hubert Kario

Oder installieren Sie unp: packages.debian.org/sid/unp . Ich denke, es ist ähnlich wie Unfoo.
Zitrax

17

Installieren Sie das Bash-Completion-Paket. Es enthält eine Reihe vordefinierter Abschlussregeln für die Shell. Aktivieren Sie es, indem Sie "source / etc / bash_completion" eingeben, wenn die Distribution dies nicht für Sie erledigt. Wenn Sie beispielsweise nach kpdf fertig sind, wird nur eine Liste von Verzeichnissen und PDF-Dateien angezeigt. Es ist so klug wie, entfernte Dateien nach scp ssh: // server / XXX zu vervollständigen (wenn Sie kennwortlose Anmeldungen aktiviert haben).


17

Ich benutze ständig diese

ALT-. (ESC +. In einigen Terminals) kopiert das zuletzt verwendete Argument (super nützlich)

STRG-W löscht das Wort

CTRL-L clear terminal (wie clear command, aber schneller)

ALT-B (ESC + B in einigen Terminals) bewegt sich ein Wort zurück

ALT-F (ESC + F in einigen Terminals) rücken ein Wort vor

STRG-E springe zu EOL

STRG-A Sprung zu BOL

STRG-R Suche im Verlauf


1
Vielen Dank für das Teilen der Verknüpfungen! Ich habe ALT-B / F unter Mac nicht zum Laufen gebracht.
Léo Léopold Hertz 준영

Ehrfürchtiger Mann ....
Daud Ahmad Khokhar

16

In der Bash verwende ich ! $ Viel. Es wiederholt das letzte Argument des letzten Befehls:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Es wird das ls ausführen. Wenn Sie es dann bearbeiten möchten, müssen Sie es nicht erneut eingeben. Verwenden Sie einfach! $. Dies ist sehr nützlich für lange Pfad- / Dateinamen. Außerdem wiederholt ! * Alle Argumente des vorherigen Befehls. Ich benutze das nicht so oft, aber es sieht nützlich aus.

Ich wusste, dass sie erwähnt wurden, aber ich benutze vim, screen und cd - sehr oft.

Ich habe noclobber vergessen:

set -o noclobber

Von Mann Bash :

Wenn gesetzt, überschreibt bash eine vorhandene Datei nicht mit den Umleitungsoperatoren>,> & und <>. Dies kann beim Erstellen von Ausgabedateien mit dem Umleitungsoperator> | außer Kraft gesetzt werden anstelle von>.


6
Ich benutze $ !, nicht, weil es wirklich leicht ist, einen fetten Finger zu haben, aber ich mag es, ^ [- zu schlagen. (Escape-Zeit), um den gleichen Effekt zu erzielen.
David Wolever

7
Abhängig von Ihrer Tastatur usw. können Sie dies auch tun Alt-..
Dennis Williamson

Omg, kleiner Orgasmus, ty Dennis!
Artifex

14

Wechseln Sie von bash zu zsh und sehen Sie, wie sich Ihre Produktivität verbessert:

  • Wirklich intelligente, skriptfähige Tab-Vervollständigung. Es vervollständigt nicht nur die Befehlszeilen, sondern alle Optionen, Namen von Manpages, Paketnamen (für apt-get / emerge usw.) und was Sie haben. Und bietet eine hilfreiche Erklärung der Optionen während der Fertigstellung. Dies alles ohne Verwendung von Scrollback-Leerzeichen, nachdem der Befehl ausgegeben wurde.
  • Tab Vervollständigung von Wildcards; Schreiben Sie cat * .txt, drücken Sie die Tabulatortaste und wählen Sie zwischen allen Dateien, die dem Ausdruck entsprechen.
  • Wechseln Sie zwischen Verzeichnissen, indem Sie einfach deren Namen eingeben.
  • Mehrere Zeileneditor-Modi. Kann sich wie vi oder emacs verhalten, wenn du es willst.
  • Anpassbare Tastenkombinationen, um alles zu tun, was Sie wollen.
  • Thematische Eingabeaufforderungen, einschließlich der Möglichkeit, Eingabeaufforderungsinformationen auf der rechten Seite des Bildschirms einzufügen und sie automatisch auszublenden, wenn Sie einen langen Befehl eingeben

Google wird Ihnen viele weitere Vorteile mitteilen.


1
Sie sollten mehr als einen Link geben. hört sich interessant an, aber verkaufe es mir, Mann!

Haben sie es geschafft, Unicode-Unterstützung aufzunehmen?

@Cory Okay, ich wollte einfach nicht plagiieren und es fühlte sich überflüssig an, meine eigenen zu schreiben, wenn es so viele gute Sachen gibt, die bereits von anderen geschrieben wurden :)

@kyku ja, es gibt eine ordentliche Unicode-Unterstützung seit vielleicht einem Jahr zurück.

sieht gut aus. Ich versuche es mal!

13

Alte Schule, einen Verzeichnisbaum von einem Ort zum anderen verschieben, Symlinks, Berechtigungen und all das Gute bewahren:

tar cBf - . | (cd /destination; tar xvBpf -)

oder über das Netzwerk

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Neue Schule:

rsync -urltv . /destination

oder über das Netzwerk

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Ein bisschen weniger tippen und einfacher zu benutzen als ssh.
Ephemient

1
-a ist dasselbe wie '-rlptgoD' - das heißt, rekursiv, Symlinks als Symlinks kopieren, Perms beibehalten, Zeitstempel beibehalten, Gruppen beibehalten, Besitzer beibehalten, Gerätedateien und Sonderdateien als Geräte- und Sonderdateien kopieren. Auch zwischen Computern ist -z (Komprimieren von Dateien vor dem Senden, Dekomprimieren nach dem Empfangen) nützlich. rsync -avz [-e ssh] ist dein Freund :-)
dr-jan

Tut -z etwas Gutes gegenüber ssh? Das würde ich nicht denken.
Paul Tomblin

rsync -avhist am besten auf einem einzelnen Computer - dies hstellt sicher, dass harte Links korrekt übertragen werden, ohne dass jeder Link in eine separate Datei umgewandelt wird. rsync -avzh . foo.com/destinationist das Äquivalent für das Netzwerk, und normalerweise brauchen Sie das nicht, -e sshda rsync wissen wird, um ssh zu verwenden.
RichVel

In diesen Tagen benutze ichrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

Voraussetzung : Sie haben ein Verzeichnis mit einer großen Liste von Dateien, die Sie löschen möchten. rm -r wird scheitern!

Beispiel

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Lösung :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Erklärung :

Edit: Fehlerbehebung nach @ephemient Kommentar.

find liefert Argumente an rm mit den maximal zulässigen Argumenten. Dies ermöglicht es rm, Dateien in Stapeln zu löschen, was die schnellste mir bekannte Technik ist, ohne die -delete-Operation von find selbst zu verwenden. Es ist gleichbedeutend mit

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

was Sie vielleicht nützlich finden, wenn Ihr findnicht unterstützt -exec ... +.


5
Ersetzen \;durch +: Dann findwird xargsstandardmäßig die Funktion ausgeführt, bei der die Argumente so oft wie möglich zusammengefasst werden (ohne das Argumentlistenlimit zu überschreiten). Oder benutze einfach -deleteintead of -exec rm(GNU Findutils benötigt für beide)
ephemient

Guter Tipp - ich kannte das '+' nicht.
Codeinthehole

@ephemient: Guter Kommentar, ich habe den Beitrag bearbeitet.
Maxim Veksler

2
Interessant, ich hatte noch nie von '+' gehört.
user18911

oder einfach find ... -delete, wenn Ihr Fund so dotiert ist.
David Wolever

11

Ich verwende diese beiden Tipps so oft, dass ich dachte, es wäre eine gute Idee, sie zu teilen:

!foo

Startet den letzten Befehl in der Verlaufsdatei, der mit "foo" beginnt (ich verwende ihn !gccbeispielsweise häufig beim Kompilieren .)

Die andere ist eine Tastenkombination (Strg + O anstelle von Return), mit der der Befehl ausgeführt und der nächste Befehl in der Verlaufsdatei angezeigt wird. Wenn ich zum Beispiel eine Datei kompiliere und teste, mache ich immer 3 oder 4 Befehle, mache, cd in das Verzeichnis des Tests, führe den Test aus, cd in das Verzeichnis des Makefiles. Mit Strg + O wird diese Aufgabe viel einfacher :)

Ich hoffe das hilft!


1
+1 für Ctrl-O
Dennis Williamson

10

So verwenden Sie Subversion unter Linux ohne die Hilfe ausgefallener grafischer Oberflächen, die möglicherweise nicht verfügbar sind.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Dies hält viele Entwickler seltsamerweise davon ab, Linux zu verwenden.


rapidsvn ist eine nette kleine gui für svn unter Linux.

Es gibt sicherlich viele ausgefallene, leistungsstarke GUIs (wie das in IntelliJ IDEA), aber ich mag die Möglichkeit, entweder diese oder die Befehlszeile (ebenfalls leistungsstark, aber anders) zu verwenden - je nachdem, was der aktuellen Situation besser entspricht
Jonik

Mein Favorit ist bei weitem NautilusSVN (ähnlich wie TortoiseSVN): code.google.com/p/nautilussvn
user7655 03.03.09

10

Meist übersehenes Kommando der alten Schule: find

Gestern habe ich einen Bruttoberechtigungsfehler behoben:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Ja! Erfahren Sie den Befehl find. Finden Sie gemischt mit Xargs, Sed und Awk macht für eine Dateiverarbeitung Moloch!
Jonathon Watney

Einverstanden! Obwohl ich mich nie an irgendetwas von sed und awk erinnere, muss ich es immer wieder neu lernen! Ich sollte wirklich ein Spickzettel ausdrucken.

Ja, aber vergessen Sie nicht, -print0 und die Option -0 für xargs zu verwenden, um knifflige Probleme mit Dateinamen zu vermeiden, die ungewöhnliche Zeichen enthalten (z. B. Backslash).
user18911

Yup, wahrscheinlich die Hälfte der Zeit finde ich es verwenden , dumm Erlaubnis Dinge zu beheben ist: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Vergessen Sie nicht -perm, findnach Dateien zu suchen, für die bestimmte Berechtigungen festgelegt wurden.
Dennis Williamson

8

Bei Shells wie bashund kshkönnen Sie die Befehlszeile auf Navigationsbefehle wie Ihren Texteditor reagieren lassen:

set -o emacs

oder

set -o vi

Damit können Sie Ihren Verlauf durchsuchen und sich in der Befehlszeile bewegen, wie Sie es von Textdateien gewohnt sind (z. B. im vi-Modus, wenn Sie drücken und ESCdann tippen, /stringwerden Ihre vorherigen Befehle nach "string" durchsucht - Sie können nund Nzum Bewegen verwenden zwischen den Spielen)


Kleiner Tippfehler: "Testeditor" sollte "Texteditor" sein

8

grep ist mein Freund. Ernsthaft.

Listen Sie die .rbDateien auf, die den Text enthalten class foo:

grep -l "class foo" .rb

Listen Sie .rbDateien auf, die keinen Text enthalten class foo:

grep -L "class foo" *.rb

Listen Sie .rbDateien auf, die weder foo noch bar enthalten (Sie können mit -e einen beliebigen regulären Ausdruck verwenden, müssen sich aber den Operatoren entziehen):

grep -L -e "foo\|bar" *.rb

Sie könnten an einem Tool namens "ack" interessiert sein, das das Gleiche tut wie grep, aber nur rekursiv Quelldateien scannt. Probieren

8

Die Shell-Substitution wird durchgeführt mit ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
Eigentlich bevorzuge ich "!!: gs / foo / bar", da ich oft finde, dass foo im vorherigen Befehl mehrmals erwähnt wird und ich einen globalen Ersatz möchte (z. B. "mv foo.txt foo.bak").
user18911
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.