Was ist Ihr Lieblingsbefehlszeilentrick mit Bash?[geschlossen]
-
09-06-2019 - |
Frage
Wir alle wissen, wie man es benutzt <ctrl>-R
um die Suche im Verlauf umzukehren, aber wussten Sie, dass Sie es verwenden können? <ctrl>-S
zur Vorwärtssuche, wenn Sie dies festlegen stty stop ""
?Haben Sie auch schon einmal versucht, bind -p auszuführen, um alle Ihre Tastaturkürzel aufgelistet zu sehen?Unter Mac OS X gibt es standardmäßig über 455.
Was ist Ihr beliebtester obskurer Trick, Tastaturkürzel oder Shopt-Konfiguration mit Bash?
Lösung 7
Wenn Befehle ausgeführt wird, manchmal möchte ich einen Befehl mit den vorherigen Argumente laufen. Um das zu tun, können Sie diese Abkürzung verwenden:
$ mkdir /tmp/new
$ cd !!:*
Gelegentlich anstelle von FIND, ich werde Ausbrechen eine einzeilige Schleife, wenn ich ein paar Befehle auf einer Liste von Dateien ausgeführt werden muß.
for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;
Konfiguration der Befehlszeilenoptionen Geschichte in meinem .bash_login (oder .bashrc) ist wirklich nützlich. Im Folgenden ist ein Kader von Einstellungen, die ich auf meinem MacBook Pro verwenden.
Zur Einstellung des folgenden macht bash Lösch doppelte Befehle in Ihrer Geschichte:
export HISTCONTROL="erasedups:ignoreboth"
I-Buchse auch meine Geschichte Größe bis zu ziemlich hoch. Warum nicht? Es scheint nicht alles auf dem heutigen Mikroprozessoren zu verlangsamen.
export HISTFILESIZE=500000
export HISTSIZE=100000
Eine andere Sache, die ich tun ist, einige Befehle aus meiner Geschichte ignorieren. Keine Notwendigkeit zu erinnern, den Befehl exit.
export HISTIGNORE="&:[ ]*:exit"
Sie wollen auf jeden Fall histappend einzustellen. Andernfalls bash überschreibt Ihre Geschichte, wenn Sie verlassen.
shopt -s histappend
Eine weitere Option, die ich benutze, ist cmdhist. Auf diese Weise können Sie mehrzeilige Befehle an die Geschichte als ein Befehl speichern.
shopt -s cmdhist
Schließlich auf Mac OS X (wenn Sie nicht vi-Modus), möchten Sie
stty stop ""
Andere Tipps
Umbenennen / Verschieben von Dateien mit Endungen schnell:
cp /home/foo/realllylongname.cpp{,-old}
Damit erweitert sich zu:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old
cd -
Es ist die Befehlszeile Äquivalent der Zurück-Taste (gelangen Sie in das vorherige Verzeichnis, das Sie in waren).
Ein weiterer Favorit:
!!
Wiederholt Ihren letzten Befehl. Am nützlichsten in der Form:
sudo !!
Mein Favorit ist '^ ^ String string2', die den letzten Befehl nimmt, ersetzt String mit string2 und führt es aus
$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz
umbenennen
Beispiel:
$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt
$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt
So nützlich
Ich bin ein Fan des !$
, !^
und !*
ExpandOS, Rückkehr aus der letzten Kommandozeile vorgelegt: Der letzten Punkt, erstem nicht-Befehl Elemente, und alle Nicht-Befehlselemente. Nämlich (Beachten Sie, dass die Schale druckt den Befehl zuerst):
$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz
Das ist praktisch, wenn Sie, ls filea fileb
sagen, und wollen eine von ihnen bearbeiten: vi !$
oder beide: vimdiff !*
. Es kann auch auf „das n
th Argument“ verallgemeinert wird in etwa so:
$ echo foo bar baz
$ echo !:2
echo bar
bar
Schließlich mit Pfadnamen, können Sie Teile des Weges erhalten, indem :h
und :t
einem der oben ExpandOS anhängt:
$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
Wie zur Liste nur Unterverzeichnisse im aktuellen?
ls -d */
Es ist ein einfacher Trick, aber Sie würden nicht wissen, wie viel Zeit ich brauchte, dass man finden!
ESC .
Fügt die letzten Argumente aus Ihrem letzten bash-Befehl. Es ist praktisch, mehr als Sie denken.
cp file /to/some/long/path
cd ESC .
Sicher, Sie können "diff file1.txt file2.txt
", aber Bash unterstützt Prozess Substitution , die Sie die Ausgabe von Befehlen an diff
ermöglicht.
Zum Beispiel, sagen wir, ich will mein Skript, um sicherzustellen, gibt mir den Ausgang ich erwarte. Ich kann nur meinen Skript wickle in <() und er an diff
einen schnellen und schmutzigen Unit-Test zu bekommen:
$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$
Als ein anderes Beispiel, sagen wir, ich überprüfen möchten, ob zwei Server die gleiche Liste von RPMs installiert haben. Anstatt auf jeden Server sshing, jede Liste von RPMs auf separate Dateien zu schreiben und eine diff
auf diesen Dateien zu tun, kann ich nur den diff
von meinem Arbeitsplatz:
$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$
Es gibt weitere Beispiele in der Erweiterte Bash-Scripting-Handbuch unter http://tldp.org/LDP/abs/ html / prozess sub.html .
Meine Lieblings Befehl "ls -thor"
Es ruft die Macht der Götter rel="nofollow die zuletzt geänderten Dateien in einem bequem zur Liste lesbares Format.
Mehr ein Novum, aber es ist klug ...
Top 10 Befehle verwendet:
$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head
Beispiel für die Ausgabe:
242 git
83 rake
43 cd
33 ss
24 ls
15 rsg
11 cap
10 dig
9 ping
3 vi
^ R Rückwärtssuche. Hit ^ R, geben Sie ein Fragment eines vorherigen Befehls übereinstimmen soll, und drücken Sie ^ R, bis Sie das gewünschte zu finden. Dann muß ich nicht zuletzt verwendete Befehle erinnern, die immer noch in meiner Geschichte. Nicht ausschließlich bash, sondern auch:. ^ E für Zeilenende, ^ A für den Anfang der Zeile, ^ U und ^ K zu löschen, bevor und nachdem die Cursor jeweils
Ich habe oft Aliase für vi, ls usw.aber manchmal möchte man dem Alias entkommen.Fügen Sie einfach einen Backslash zum Befehl davor hinzu:
Z.B:
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
Cool, nicht wahr?
Hier ein paar Konfigurations zwickt:
~/.inputrc
:
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
Dies funktioniert genauso wie ^R
aber mit den Pfeiltasten statt. Das bedeutet, ich eingeben kann (z) cd /media/
dann Pfeil nach oben schlagen auf das letzte, was gehe ich in den cd
Ordner /media/
'd.
(Ich benutze Gnome-Terminal, können Sie die Escape-Codes für andere Terminal-Emulatoren ändern müssen.)
Bash Abschluss ist auch unglaublich nützlich, aber es ist ein viel subtiler hinaus. In ~/.bashrc
:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
Damit können pro-Programm Tab-Vervollständigung (z Tabulatorvervollständigung versuchen, wenn die Befehlszeile mit evince
startet nur Dateien anzeigen öffnende evince kann, und es wird auch Tabula vollständige Befehlszeilenoptionen).
funktioniert gut mit dieser auch in ~/.inputrc
:
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
Ich benutze das folgende viel:
Der :p
Modifikator eine Geschichte Folge zu drucken. Z.
!!:p
Wird den letzten Befehl drucken, so können Sie überprüfen, ob es richtig ist es wieder vor dem Ausführen. Geben Sie !!
es auszuführen.
In ähnlicher Weise:
!?foo?:p
Wird Ihre Geschichte für den letzten Befehl suchen, die die Zeichenfolge ‚foo‘ enthalten und drucken Sie es.
Wenn Sie nicht drucken müssen,
!?foo
funktioniert die Suche und führt es sofort.
Ich habe eine geheime Waffe bekam. Shell-fu
Es gibt Tausende von Tipps und Tricks, coole Tricks und effiziente Rezepte, die die meiste Zeit passen auf eine einzige Zeile.
Eine, die ich liebe (aber ich betrügen ein bisschen, da ich die Tatsache nutzen, dass Python auf den meisten Unix-System installiert ist jetzt):
alias webshare='python -m SimpleHTTPServer'
Nun, jedes Mal Sie „webshare“, wird das aktuelle Verzeichnis über den Port 8000. Wirklich nett zur Verfügung, wenn Sie Dateien mit Freunden auf einem lokalen Netzwerk ohne USB-Stick oder Remote dir teilen möchten. Streaming-Video und Musik arbeiten.
Und natürlich die klassische Gabel Bombe, die völlig nutzlos, aber immer noch eine Menge Spaß ist:
$ :(){ :|:& };:
Versuchen Sie, dass nicht in einem Produktionsserver ...
Sie können die Uhr Befehl in Verbindung mit einem anderen Befehl für Änderungen suchen verwenden. Ein Beispiel hierfür war, als ich meinen Router testete, und ich wollte wie Signal-Rausch-Verhältnis up-to-date Zahlen auf Sachen zu bekommen, etc.
watch --interval=10 lynx -dump http://dslrouter/stats.html
type -a PROG
, um alle Orte zu finden, wo PROG verfügbar ist, in der Regel irgendwo in ~ / sind eher als die in / usr / bin / PROG, die man hätte erwarten können.
Ich mag Befehle konstruieren, mit echo und Rohr sie an die Schale:
$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s
Warum? Weil es mir erlaubt, zu sehen, was getan werden los, bevor ich es tun. Auf diese Weise, wenn ich einen schrecklichen Fehler haben (wie mein Home-Verzeichnis zu entfernen), kann ich es fangen, bevor es passiert. Offensichtlich ist dies sehr wichtig für destruktiv oder unwiderrufliche Aktionen.
Wenn Sie eine große Datei herunterzuladen ich ziemlich oft tun:
while ls -la <filename>; do sleep 5; done
Und dann nur ctrl + c, wenn ich fertig bin (oder wenn ls
kehrt nicht Null). Es ist ähnlich dem watch
Programm, aber es nutzt die Schale statt, so dass es auf Plattformen ohne watch
funktioniert.
Ein weiteres nützliches Tool ist netcat oder nc
. Wenn Sie das tun:
nc -l -p 9100 > printjob.prn
Dann können Sie einen Drucker auf einem anderen Computer einrichten, sondern die IP-Adresse des Computers mit netcat verwenden. Wenn der Druckauftrag gesendet wird, wird es durch den Computer laufen netcat und kippte in printjob.prn
empfangen wird.
pushd
und popd
fast immer kommen in praktisch
Eine bevorzugte Art und Weise der Navigation, wenn ich in weit getrennten Orten in einer Baumhierarchie mehr Verzeichnisse bin mit ist acf_func.sh (siehe unten) zu verwenden. Einmal definiert, können Sie
cd -
eine Liste der zuletzt angezeigten Verzeichnisse zu sehen, die mit einem numerischen Menü
cd -2
, um zur zweitletzten Verzeichnis.
Sehr einfach zu bedienen, sehr praktisch.
Hier ist der Code:
# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain
cd_func ()
{
local x2 the_new_dir adir index
local -i cnt
if [[ $1 == "--" ]]; then
dirs -v
return 0
fi
the_new_dir=$1
[[ -z $1 ]] && the_new_dir=$HOME
if [[ ${the_new_dir:0:1} == '-' ]]; then
#
# Extract dir N from dirs
index=${the_new_dir:1}
[[ -z $index ]] && index=1
adir=$(dirs +$index)
[[ -z $adir ]] && return 1
the_new_dir=$adir
fi
#
# '~' has to be substituted by ${HOME}
[[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"
#
# Now change to the new dir and add to the top of the stack
pushd "${the_new_dir}" > /dev/null
[[ $? -ne 0 ]] && return 1
the_new_dir=$(pwd)
#
# Trim down everything beyond 11th entry
popd -n +11 2>/dev/null 1>/dev/null
#
# Remove any other occurence of this dir, skipping the top of the stack
for ((cnt=1; cnt <= 10; cnt++)); do
x2=$(dirs +${cnt} 2>/dev/null)
[[ $? -ne 0 ]] && return 0
[[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
if [[ "${x2}" == "${the_new_dir}" ]]; then
popd -n +$cnt 2>/dev/null 1>/dev/null
cnt=cnt-1
fi
done
return 0
}
alias cd=cd_func
if [[ $BASH_VERSION > "2.05a" ]]; then
# ctrl+w shows the menu
bind -x "\"\C-w\":cd_func -- ;"
fi
komplizierte Linien erweitern, bevor die gefürchtete eingeben
Schlagen- Alt + Strg + e - Shell-expand-line (Möglicherweise müssen Esc , Strg + e auf der Tastatur)
- Strg + _ - Rückgängig
- Strg + x , * - Glob-expand-Wort
$ echo !$ !-2^ *
Alt + Strg + e
$ echo aword someotherword *
Strg + _
$ echo !$ !-2^ *
Strg + x , *
$ echo !$ !-2^ LOG Makefile bar.c foo.h
& c.
Ich habe schon immer teilweise zu:
ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line
Ich benutze auch shopt -s cdable_vars
, dann können Sie bash Variablen auf gemeinsame Verzeichnisse erstellen. Also, für mein Unternehmens des Quellbaum, erstelle ich eine Reihe von Variablen wie:
export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"
dann kann ich in das Verzeichnis von cd Dcentmain
ändern.
pbcopy
Diese Kopien an die Mac-System-Zwischenablage. Sie können über die Pipeline-Befehle, um es ... versuchen:
pwd | pbcopy
$ touch {1,2}.txt
$ ls [12].txt
1.txt 2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007 touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done
Unter Verwendung von ‚set -o vi‘ von der Kommandozeile, oder besser gesagt, in Bashrc, versetzen Sie in vi Editiermodus auf der Kommandozeile. Sie starten in ‚Insert‘ -Modus, so dass Sie als normale Art und Backspace kann, aber wenn man einen ‚großen‘ Fehler machen können Sie die esc-Taste drücken und dann ‚b‘ verwenden und ‚f‘ zu bewegen, wie Sie in vi tun. cw um ein Wort zu ändern. Besonders nützlich, wenn Sie eine Geschichte Befehl gebracht haben, die Sie ändern möchten.
Ähnlich wie bei vielen oben, mein derzeitiger Favorit ist der Tastendruck [alt]. (Alt und „“ Tasten zusammen) ist dies das gleiche wie $! (Fügt das letzte Argument von dem vorherigen Befehl), außer, dass es sofort und für mich einfacher tippen. (Kann einfach nicht in Skripts verwendet werden)
Beispiel:
mkdir -p /tmp/test/blah/oops/something
cd [alt].
String mehrere Befehle zusammen mit der && Befehl:
./run.sh && tail -f log.txt
oder
kill -9 1111 && ./start.sh