Shell-Skripte werden häufig als Klebstoff für die Automatisierung und einfache einmalige Aufgaben verwendet. Was sind einige Ihrer bevorzugten "versteckten" Funktionen der Bash-Shell / Skriptsprache?
- Eine Funktion pro Antwort
- Geben Sie ein Beispiel und eine kurze Beschreibung der Funktion, nicht nur einen Link zur Dokumentation
- Beschriften Sie das Feature mit fettem Titel als erste Zeile
Siehe auch:
- Versteckte Funktionen von C.
- Versteckte Funktionen von C #
- Versteckte Funktionen von C ++
- Versteckte Funktionen von Delphi
- Versteckte Funktionen von Python
- Versteckte Funktionen von Java
- Versteckte Funktionen von JavaScript
- Versteckte Funktionen von Ruby
- Versteckte Funktionen von PHP
- Versteckte Funktionen von Perl
- Versteckte Funktionen von VB.Net
bash
shell
scripting
hidden-features
Robert Harvey
quelle
quelle
!$
zu schwer, schnell zu tippen. Ich muss immer langsamer werden und darüber nachdenken, das Dollarzeichen an zweiter Stelle zu setzen.Alt
+.
ist schneller und einfacher. Ganz zu schweigen davon, dass Sie den Text tatsächlich sehen, bevor Sie ihn ausführen.Wenn Sie einen Prozess nach dem Abmelden am Laufen halten möchten:
disown -h <pid>
ist eine nützliche integrierte Bash. Im Gegensatz dazu
nohup
können Siedisown
einen bereits laufenden Prozess ausführen .Beenden Sie zuerst Ihren Job mit control-Z, rufen Sie die PID ab
ps
(oder verwenden Sie sieecho $!
),bg
senden Sie sie in den Hintergrund und verwenden Sie sie danndisown
mit dem Flag -h.Vergessen Sie nicht, Ihren Job als Hintergrund zu verwenden, da er sonst beim Abmelden beendet wird.
quelle
jobs -l
(oder-p
)fork()
undexec()
seine Argumente geschrieben, im Wesentlichen einen Daemonizer. Ich kann die Granate bombardieren und etwas auf einmal ausführenbgexec google-chrome && exit
.screen
?Fast alles, was im Handbuch unter ERWEITERUNG aufgeführt ist
Insbesondere Parametererweiterung:
$ I=foobar $ echo ${I/oo/aa} #replacement faabar $ echo ${I:1:2} #substring oo $ echo ${I%bar} #trailing substitution foo $ echo ${I#foo} #leading substitution bar
quelle
Mein Favorit:
Führen Sie den vorherigen Befehl mit sudo erneut aus.
quelle
Weitere magische Tastenkombinationen:
Ctrl+ rstartet eine "umgekehrte inkrementelle Suche" durch Ihren Befehlsverlauf. Während Sie weiter tippen, wird der neueste Befehl abgerufen, der den gesamten eingegebenen Text enthält.
Tab Vervollständigt das Wort, das Sie bisher eingegeben haben, wenn es eindeutig ist.
Tab Tab listet alle Vervollständigungen für das Wort auf, das Sie bisher eingegeben haben.
Alt+ * fügt alle möglichen Vervollständigungen ein, was besonders hilfreich ist, wenn Sie gerade einen potenziell zerstörerischen Befehl mit Platzhaltern eingegeben haben:
rm -r source/d*.c
Alt + *rm -r source/delete_me.c source/do_not_delete_me.c
Ctrl+ Alt+ eführt Alias, Verlauf und Shell-Erweiterung in der aktuellen Zeile aus. Mit anderen Worten, die aktuelle Zeile wird erneut angezeigt, da sie von der Shell verarbeitet wird:
ls $HOME/tmp
Ctrl Alt + els -N --color=tty -T 0 /home/cramey
quelle
Holen Sie sich Verlaufsbefehle und Argumente zurück
Mit dem
!
Operator können Sie selektiv auf vorherige Befehle und Argumente zugreifen . Dies ist sehr nützlich, wenn Sie mit langen Pfaden arbeiten.Sie können Ihre letzten Befehle mit überprüfen
history
.Sie können vorherige Befehle verwenden, wobei
!<n>
diesn
der Index des Befehlshistory
ist. Negative Zahlen zählen vom letzten Befehl im Verlauf rückwärts.Sie können vorherige Argumente mit verwenden
!:<n>
, Null ist der Befehl,> = 1 sind die Argumente.Und Sie können beides mit kombinieren
!<n>:<m>
Sie können auch Argumentbereiche verwenden
!<n>:<x>-<y>
Andere
!
spezielle Modifikatoren sind:*
für alle Argumente^
für das erste Argument (!:1
==!^
)$
für das letzte Argumentquelle
Ich mag die -x-Funktion, mit der Sie sehen können, was in Ihrem Skript vor sich geht.
quelle
SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"
quelle
Hier ist einer meiner Favoriten. Dadurch wird festgelegt, dass die Tab-Vervollständigung nicht zwischen Groß- und Kleinschreibung unterscheidet. Es ist wirklich großartig, um schnell Verzeichnispfade einzugeben, insbesondere auf einem Mac, bei dem das Dateisystem standardmäßig nicht zwischen Groß- und Kleinschreibung unterscheidet. Ich habe dies
.inputrc
in meinem Home-Ordner abgelegt .set completion-ignore-case on
quelle
Die spezielle Variable zufällig:
if [[ $(($RANDOM % 6)) = 0 ]] then echo "BANG" else echo "Try again" fi
quelle
$
Siegel innerhalb der arithmetischen Bewertung; Keine separate Bewertung und Prüfung erforderlich:if (( RANDOM % 6 == 0 )); then echo "BANG"; else echo "Try again"; fi
Oder noch kürzer :(( RANDOM % 6 )) && echo "Try again" || echo "BANG"
.Umgang mit regulären Ausdrücken
In den letzten Bash-Versionen werden reguläre Ausdrücke abgeglichen, sodass Sie Folgendes tun können:
if [[ "mystring" =~ REGEX ]] ; then echo match fi
Dabei ist REGEX ein regulärer Rohausdruck in dem von man re_format beschriebenen Format.
Übereinstimmungen von Teilen in Klammern werden im Array BASH_REMATCH gespeichert, beginnend mit Element 1 (Element 0 ist die übereinstimmende Zeichenfolge in ihrer Gesamtheit), sodass Sie dies auch zum Parsen mit Regex verwenden können.
quelle
Ctrlx Ctrle
Dadurch wird der aktuelle Befehl in den in der Variablen VISUAL definierten Editor geladen. Dies ist sehr nützlich für lange Befehle wie einige der hier aufgeführten.
So verwenden Sie vi als Editor:
export VISUAL=vi
quelle
set -o vi
dann geht Esc bei einem Befehl zur Inline-Bearbeitung, ein einfaches 'v' zieht den Befehl in einen vollständigen vi-Editor.Schnelle und fehlerhafte Korrektur von Tippfehlern (besonders nützlich für lange Befehle über langsame Verbindungen, bei denen es schrecklich wäre, den Befehlsverlauf zu verwenden und durch ihn zu scrollen):
Versuchen Sie auch
!:s/old/new
einmal, im vorherigen Befehl alt durch neu zu ersetzen.Wenn Sie viele Vorkommen ersetzen möchten, können Sie eine globale Ersetzung mit durchführen
!:gs/old/new
.Sie können die Befehle
gs
unds
mit jedem Verlaufsereignis verwenden, zIm vorletzten Befehl
old
durchnew
(einmal) ersetzen .quelle
man bash
. Versuchen Sie!:s/old/new
einmal, im vorherigen Befehl das Alte durch das Neue zu ersetzen. Wenn Sie viele Vorkommen ersetzen möchten, können Sie eine globale Ersetzung mit durchführen!:gs/old/new
. Dies kann mit James 'Post ( stackoverflow.com/questions/211378/hidden-features-of-bash/… ) kombiniert werden , z. B.: ( Ersetzt!$:s/old/new
altes durch neues im letzten Argument des vorherigen Befehls),!-2:0:gs/a/s !-2*
(ersetzt jedes Vorkommen von a mit s im vorletzten Befehlsnamen und fügt alle Argumente des vorletzten Befehls hinzu). Viel Glück!Hier zwei meiner Favoriten:
Um die Syntax zu überprüfen, ohne das Skript wirklich auszuführen, verwenden Sie:
Gehen Sie zurück zum letzten Verzeichnis (ja, ich kenne Pushd und Popd, aber das geht schneller)
cd -
quelle
Verwenden von Infool Boolean Operators
Betrachten Sie das einfache wenn:
if [ 2 -lt 3 ] then echo "Numbers are still good!" fi
Das sieht irgendwie hässlich aus. Nicht sehr modern. Wenn Sie doppelte Klammern um Ihren booleschen Ausdruck verwenden, können Sie die normalen booleschen Operatoren verwenden!
if [[ 2 < 3 ]] then echo "Numbers are still good!" fi
quelle
Arrays:
#!/bin/bash array[0]="a string" array[1]="a string with spaces and \"quotation\" marks in it" array[2]="a string with spaces, \"quotation marks\" and (parenthesis) in it" echo "There are ${#array[*]} elements in the array." for n in "${array[@]}"; do echo "element = >>${n}<<" done
Weitere Details zu Arrays (und anderen erweiterten Bash-Skripten) finden Sie im Advanced Bash-Scripting-Handbuch .
quelle
Ausführen eines Befehls vor dem Anzeigen der Bash-Eingabeaufforderung
Legen Sie einen Befehl in der env-Variablen "PROMPT_COMMAND" fest, der vor jeder Eingabeaufforderung automatisch ausgeführt wird. Beispiel:
[lsc@home]$ export PROMPT_COMMAND="date" Fri Jun 5 15:19:18 BST 2009 [lsc@home]$ ls file_a file_b file_c Fri Jun 5 15:19:19 BST 2009 [lsc@home]$ ls
Fügen Sie für die nächsten April-Narren "export PROMPT_COMMAND = cd" zu .bashrc hinzu, lehnen Sie sich zurück und beobachten Sie, wie sich die Verwirrung entfaltet.
quelle
Magische Tastenkombinationen von den Bash-
man
Seiten:Ctrl+ aund Ctrl+ ebewegen den Cursor an den Anfang bzw. das Ende der aktuellen Zeile.
Ctrl+ tund Alt+ ttransponieren das Zeichen und das Wort vor dem Cursor mit dem aktuellen und bewegen den Cursor dann vorwärts.
Alt+ uund Alt+ lkonvertieren das aktuelle Wort (vom Cursor bis zum Ende) in Groß- und Kleinbuchstaben.
Tipp: Drücken Sie Alt+ –gefolgt von einem dieser Befehle, um den Anfang des aktuellen Wortes zu konvertieren .
Bonus-
man
Tipps:man
Verwenden Sie /beim Anzeigen von Seiten die Suche nach Text auf den Seiten. Verwenden Sie ndiese Option, um zum nächsten Spiel oder Nzum vorherigen Spiel zu springen .Beschleunigen Sie die Suche nach einem bestimmten Befehl oder Unterabschnitt innerhalb der
man
Seiten, indem Sie deren Formatierung nutzen:o Anstatt zu tippen /history expansion, um diesen Abschnitt zu finden, versuchen Sie /^history, mit caret (
^
) nur Zeilen zu finden, die mit "history" beginnen .o Versuchen Sie / readmit ein paar führenden Leerzeichen, nach diesem integrierten Befehl zu suchen. Builtins werden immer in die
man
Seiten eingerückt .quelle
export TMOUT=$((15*60))
Beenden Sie die Bash nach 15 Minuten Leerlaufzeit und setzen Sie sie zum Deaktivieren auf 0. Normalerweise lege ich dies auf meinen Root-Konten auf ~ / .bashrc. Dies ist praktisch, wenn Sie Ihre Boxen verwalten, und Sie können vergessen, sich abzumelden, bevor Sie das Terminal verlassen.
quelle
Rückgängig machen
C-S-- Control Shift Minus Rückgängigmachen von Tippaktionen.
Töte / ziehe
Jeder Löschvorgang C-w(vorheriges Wort löschen), C-k(bis zum Zeilenende löschen), (bis zum Zeilenanfang C-ulöschen) usw. ... kopiert den gelöschten Text in den Tötungsring. Sie können den letzten Tötungsvorgang einfügen mit: C-yund durchlaufen (und) Einfügen aus) dem Ring gelöschter Elemente mitAlt-y
quelle
Sie können bestimmte Dateien beim Ausfüllen der Registerkarte ignorieren, indem Sie die
FIGNORE
Variable festlegen .Wenn Sie beispielsweise ein Subverion-Repo haben und einfacher navigieren möchten, tun Sie dies
export FIGNORE=".svn"
Jetzt können Sie,
cd
ohne von.svn
Verzeichnissen blockiert zu werden .quelle
Arithmetik verwenden:
if [[ $((2+1)) = $((1+2)) ]] then echo "still ok" fi
quelle
Klammererweiterung
Standarderweiterung mit {x, y, z}:
$ echo foo{bar,baz,blam} foobar foobaz fooblam $ cp program.py{,.bak} # very useful with cp and mv
Sequenzerweiterung mit {x..y}:
$ echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z $ echo {a..f}{0..3} a0 a1 a2 a3 b0 b1 b2 b3 c0 c1 c2 c3 d0 d1 d2 d3 e0 e1 e2 e3 f0 f1 f2 f3
quelle
Ich habe kürzlich Csh Programming Considered Harmful gelesen, das dieses erstaunliche Juwel enthielt:
device=/dev/rmt8 dd_noise='^[0-9]+\+[0-9]+ records (in|out)$' exec 3>&1 status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1` exit $status;
quelle
Inhalt einer Datei abschneiden (Datei auf Null setzen)
Dies ist insbesondere sehr gut zum Abschneiden von Protokolldateien geeignet, wenn die Datei von einem anderen Prozess geöffnet wird, der möglicherweise noch in die Datei schreibt.
quelle
set -o noclobber
. Dann müssen Sie>| file
eine Datei abschneiden.Nicht wirklich eine Funktion , sondern eine Richtung: Ich habe viele „versteckte Features“, Geheimnisse und verschiedene bash Nützlichkeit bei gefunden commandlinefu.com . Viele der am besten bewerteten Antworten auf diese Antworten habe ich auf dieser Seite gelernt :)
quelle
Noch eine kleine: Alt+#
kommentiert die aktuelle Zeile aus und verschiebt sie in den Verlaufspuffer.
Wenn Sie also eine Befehlszeile zusammenstellen und einen Zwischenbefehl ausgeben müssen, um z. B. eine Datei zu finden, drücken Sie einfach Alt + #, geben den anderen Befehl ein, gehen in den Verlauf, kommentieren aus und fahren fort.
quelle
Klammern anstelle von
do
unddone
in for-SchleifeFor
Schleifenkörper sind normalerweise indo...done
(nur ein Beispiel):for f in *; do ls "$f"; done
Aber wir können einen C-Stil mit geschweiften Klammern verwenden:
for f in *; { ls "$f"; }
Ich denke das sieht besser aus als
do...done
und ich bevorzuge dieses. Ich habe dies noch in keiner Bash-Dokumentation gefunden, daher ist dies wirklich eine versteckte Funktion.quelle
Numerische Ausdrücke im C-Stil:
let x="RANDOM%2**8" echo -n "$x = 0b" for ((i=8; i>=0; i--)); do let n="2**i" if (( (x&n) == n )); then echo -n "1" else echo -n "0" fi done echo ""
quelle
Diese Eigenschaften sind ein weiterer meiner Favoriten.
export HISTCONTROL=erasedups export HISTSIZE=1000
Der erste stellt sicher, dass bash Befehle nicht mehr als einmal protokolliert, was
history
die Nützlichkeit wirklich verbessert . Der andere erweitert die Verlaufsgröße von 100 auf 1000. Ich habe dies auf meinen Computern auf 10000 festgelegt.quelle