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?

War es hilfreich?

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 -S zum Zurücksetzen von Scroll-Stopp zu sein. Dies verhindert, dass bash von der Möglichkeit, es als Vorwärtssuche zu interpretieren.

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

Bash Kommandozeile Geschichte Führung

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 nth 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top