72 Stimmen

Versteckte Funktionen der Bash

Shell-Skripte werden oft als Klebstoff für die Automatisierung und einfache einmalige Aufgaben verwendet. Was sind Ihre bevorzugten "versteckten" Funktionen der Shell/Skriptsprache Bash?

  • Ein Merkmal pro Antwort
  • Geben Sie ein Beispiel und eine kurze Beschreibung der Funktion, nicht nur einen Link zur Dokumentation
  • Beschriften Sie das Merkmal mit einem fettgedruckten Titel in der ersten Zeile

Siehe auch:

2voto

Dennis Williamson Punkte 322329

Wie andere bereits erwähnt haben, Ctrl - r eignet sich hervorragend, um Ihre Befehlshistorie zu durchforsten. Was aber, wenn Sie vorwärts gehen wollen, nachdem Sie einen oder ein paar Schritte zu viel gemacht haben? Das ist der Punkt, an dem Ctrl - s ist sehr nützlich. Normalerweise ist er jedoch auf XOFF (Datenfluss unterbrechen) abgebildet. Da dies nicht mehr allzu nützlich ist, weil wir keine langsamen seriellen Terminals verwenden, können Sie diese Zuordnung mit abschalten:

stty -ixon

in Ihrem ~/.bashrc Datei.

Dies macht auch Ctrl - q verfügbar, das normalerweise ein Duplikat von Ctrl - v (quoted-insert, mit dem Sie ein wörtliches Steuerzeichen einfügen können). Ich habe Ctrl - q dem Menü "Vervollständigen" zugeordnet, das bei wiederholtem Drücken durch die Vervollständigungen geht. Ich lasse gerne Tab auf regulär abgeschlossen gesetzt.

Sie können einstellen Ctrl - q auf menu-complete umstellen, indem Sie diese Zeile in Ihr ~/.inputrc Datei:

"\C-q": menu-complete

2voto

wnrph Punkte 3145

Hier Streicher ( <<< ). Das Bash-Handbuch enthält diese Beschreibung:

Das Wort wird expandiert und dem Befehl über die Standardeingabe zugeführt.

Exemple :

$ cat<<<"$(( 10*3+1 )) nice isn't it?"
31 nice isn't it?

1voto

Shawn Chin Punkte 78582

Verwendung des eingebauten Bash-Befehls 'let' für grundlegende arithmetische Berechnungen

A=10
let B="A * 10 + 1" # B=101
let B="B / 8"      # B=12, let does not do floating point
let B="(RANDOM % 6) + 1" # B is now a random number between 1 and 6

Für Fließkomma-Auswertungen können Sie den Befehl "bc" verwenden (kein Bestandteil der Bash).

FP=`echo "scale=4; 10 / 3" | bc` # FP="3.3333"

1voto

Tom Punkte 361

Substitution mit <(cmd ...) oder >(cmd ...) verarbeiten

In jeder Form wird cmd ausgeführt, wobei die Ein- oder Ausgabe mit einem FIFO verbunden ist, und der Pfad zu diesem FIFO wird in der Befehlszeile ersetzt:

$ echo A file to read: <(cat), a file to write to: >(cat)
A file to read: /dev/fd/63, a file to write to: /dev/fd/62

Zum Beispiel, um zwei Websites zu vergleichen, ohne Zwischendateien zu speichern:

$ diff <(curl -s http://tldp.org/LDP/abs/html/) <(curl -s http://www.redhat.com/mirrors/LDP/LDP/abs/html/)

Wenn Sie einen Befehl haben, der einen Dateinamen als Eingabe akzeptiert, aber kein '-' für stdout zulässt, können Sie ihn austricksen:

$ do_thingee --log -
error: can't open log file: '-'
$ do_thingee --log >(cat)
do_thingee v0.2
initializing things
processing 4 things
done

1voto

Tom Punkte 361

Spezielle Socket-Dateinamen: /dev/tcp/HOST/PORT und /dev/udp/HOST/PORT

Lesen von einem Tagesserver (Port 13):

$ cat < /dev/tcp/utcnist.colorado.edu/13

55786 11-08-13 03:34:21 50 0 0 172.3 UTC(NIST) *

Dies kann sehr nützlich sein in Verbindung mit tcpserver .

Ein weitergehendes Beispiel aus http://thesmithfam.org/blog/2006/05/23/bash-socket-programming-with-devtcp-2/ wenn Sie keinen Zugang zu wget oder curl haben:

$ exec 3<>/dev/tcp/www.google.com/80 # hook up to file desc 3
$ echo -e "GET / HTTP/1.1\n\n" >&3   # send the HTTP request
$ cat <&3                            # read the HTTP response

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X