Was ist Ihr beliebtester Befehlszeilentrick mit Bash? [geschlossen]


156

Wir alle wissen, wie man die <ctrl>-RSuche im Verlauf umkehrt, aber wussten Sie, dass Sie die <ctrl>-SSuche weiterleiten können, wenn Sie dies festlegen stty stop ""? Haben Sie jemals 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 Ihre beliebteste obskure Trick-, Tastaturkürzel- oder Shopt-Konfiguration mit Bash?


2
Bitte formulieren Sie dies um, um zu sagen: "Was ist Ihr Favorit?" Dies ermöglicht es den Menschen, bestimmte Antworten zu verbessern, fast wie bei einer Umfrage.
SCdF

> Bitte formulieren Sie dies um, um zu sagen: "Was ist Ihr Favorit?" Getan.
Martin Klinke

1
Es ist ein Klon Stackoverflow nur auf diese Frage: commandlinefu.com
RKB

Nur 232 dieser 455 Standardschlüsselbindungen führen etwas anderes als "Selbsteinfügung" ("Geben Sie diesen Schlüssel ein") aus: $ bind -p | grep -v Selbsteinfügung | wc
Ed Brannin

Ein paar nette Sachen hier. Aber es sollte beachtet werden, dass einige von ihnen nur funktionieren, wenn sich die Bash im Emacs-Modus befindet ...
Mo.

Antworten:


157

Dateien mit Suffixen schnell umbenennen / verschieben:
cp /home/foo/realllylongname.cpp{,-old}

Dies erweitert sich auf:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


12
Genial! Jetzt muss ich versuchen, mich an diesen zu erinnern.
Jon Ericson

9
Nur um darauf hinzuweisen, dass Sie das Gegenteil tun würden (von .cpp-old zu .cpp), cp /home/foo/realllylongname.cpp{-old,}
Michael Ekoka

Rückblickend so offensichtlich, und doch glaube ich nicht, dass ich daran denken würde, es alleine zu tun. Vielen Dank!
Zecc

150
cd -

Dies ist das Befehlszeilenäquivalent der Schaltfläche "Zurück" (führt Sie zum vorherigen Verzeichnis, in dem Sie sich befanden).


6
Ich bevorzuge es , selbst einen Verzeichnisstapel zu verwenden pushdund popdzu pflegen.
Alex M

21
Aber 'cd -' hat den Vorteil, dass es funktioniert, auch wenn Sie nicht daran gedacht haben, pushd zu verwenden.
Sergio Acosta

10
Es ist erwähnenswert, dass 'cd' Sie zu Ihrem Home-Verzeichnis führt.
Dr.-Jan

Es ist interessant, dass dies nicht in man cdoder cd --help(zumindest in meinem) auftaucht .
Halil Özgür

135

Ein weiterer Favorit:

!!

Wiederholt Ihren letzten Befehl. Am nützlichsten in der Form:

sudo !!

81
Es hat den zusätzlichen Vorteil, dass Sie auch darüber wirklich wütend klingen. "Computer, mach das." "Zugriff abgelehnt". "TU ES!!"
Nickf

Das ist nicht wenig bekannt! :-)
Hoyhoy

10
Ähnliche Dinge, die Sie tun können: mkdir testdir; cd !$.. Dies läuft cd [last word of previous line](im Beispiel cd testdir)
dbr

13
Mach mich zu einem Sandwich Sudo !!
Kibbee

Wenn du magst !! ,! $ Und! -1: ^ foo ^ bar, wirst du auch "Space: magic-space binden". stackoverflow.com/questions/603696/…
Yoo

81

Mein Favorit ist '^ string ^ string2', der den letzten Befehl entgegennimmt, string durch string2 ersetzt und ausführt

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Bash-Befehlszeilenverlaufshandbuch


Das ist nicht gierig. Wie mache ich es gierig?
Altreus

9
!!:gs/ehco/echo/
andre-r

Die 2. Seite dieses Handbuchs ist wichtig
jmoz

1
@ underneutes r: !!:gs/ehco/echo/führt auf den letzten Befehl (confer eine globale Suche und ersetzen !!in stackoverflow.com/questions/68372/... ). Das ist nicht gleichbedeutend damit, ^ehco^echodass nur eine Instanz von "ehco" ersetzt wird - eine genauere Antwort wäre !!:s/ehco/scho.
Island_jack

64

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


3
Wow, ich war all die Jahre ein Idiot und habe dazu Basename, MV und {} Tricks verwendet. / Stirngeschmack.
Gregg Lind

7
Das Umbenennen ist jedoch nicht bash- / readline-spezifisch wie die anderen Beiträge.
Waffen

1
zmv aus der zsh-Verteilung ist in den meisten Fällen viel besser.
ZyX

util-linux-ng hat auch einen Umbenennungsbefehl und ist nicht wie der in dieser Antwort erwähnte. Der hier beschriebene Befehl ist eigentlich mmv .
Cristian Ciupitu

60

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. (Beachten Sie, dass die Shell den Befehl zuerst ausgibt):

$ 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

Dies ist praktisch, wenn Sie beispielsweise ls filea filebeinen von ihnen bearbeiten möchten: vi !$oder beide : vimdiff !*. Es kann auch wie folgt auf "das nth-Argument" verallgemeinert werden:

$ echo foo bar baz
$ echo !:2
echo bar
bar

Schließlich mit Pfadnamen, können Sie Teile des Pfads erhalten durch Anhängen :hund :teinem der oben ExpandOS:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

Das 'Echo !! 2' hat bei mir nicht funktioniert und aus einem späteren Beitrag habe ich gesehen, dass ich denke, es sollte sein: 'Echo !: 2'
user13060

8
füge "bind Space: magic-space" zu .bashrc und jedem hinzu! Die Kombination wird automatisch erweitert, wenn Sie die Leertaste drücken.
Yoo

47

Wenn ich Befehle ausführe, möchte ich manchmal einen Befehl mit den vorherigen Argumenten ausführen. Dazu können Sie diese Verknüpfung verwenden:

$ mkdir /tmp/new
$ cd !!:*

Gelegentlich breche ich anstelle von find eine einzeilige Schleife aus, wenn ich eine Reihe von Befehlen für eine Liste von Dateien ausführen muss.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

Das Konfigurieren der Befehlszeilenverlaufsoptionen in meinem .bash_login (oder .bashrc) ist sehr nützlich. Im Folgenden finden Sie eine Reihe von Einstellungen, die ich auf meinem Macbook Pro verwende.

Wenn Sie Folgendes einstellen, löscht bash doppelte Befehle in Ihrem Verlauf:

export HISTCONTROL="erasedups:ignoreboth"

Ich habe auch meine Geschichtsgröße ziemlich hoch gesteckt. Warum nicht? Es scheint die heutigen Mikroprozessoren nicht zu verlangsamen.

export HISTFILESIZE=500000
export HISTSIZE=100000

Eine andere Sache, die ich tue, ist, einige Befehle aus meinem Verlauf zu ignorieren. Sie müssen sich nicht an den Befehl exit erinnern.

export HISTIGNORE="&:[ ]*:exit"

Sie möchten auf jeden Fall histappend setzen. Andernfalls überschreibt bash Ihren Verlauf beim Beenden.

shopt -s histappend

Eine andere Option, die ich benutze, ist cmdhist. Auf diese Weise können Sie mehrzeilige Befehle als einen Befehl im Verlauf speichern.

shopt -s cmdhist

Schließlich möchten Sie unter Mac OS X (wenn Sie den vi-Modus nicht verwenden) <CTRL> -S vom Scroll-Stopp zurücksetzen. Dies verhindert, dass bash es als Vorwärtssuche interpretieren kann.

stty stop ""

6
Ich finde "Alt-". viel besser als "!!: *", um das letzte Wort des letzten Befehls zu wiederholen.
Weidenrinde

Ergänzungen für histroy: 1. Speichern Sie regelmäßig den Verlauf (mit -a, wenn mehrere Shells gleichzeitig geöffnet sind). Export PROMPT_COMMAND = "history -a" 2. Alias ​​zum Lesen des Verlaufs aus anderen Shells. alias - h = 'history -n; Geschichte | grep '
Weidenrinde

export HISTIGNORE = "[] *" ist nicht erforderlich, da Ihr HISTCONTROL = ignoreboth dasselbe tun sollte
Weidenrinde

Eine weitere schöne Sache für die Geschichte: Export HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde

Versuchen Sie "cd! $", Um ein paar Tastenanschläge von "cd !!: *" zu sparen. Das "! $" Wird als letztes Argument Ihres letzten Befehls interpretiert.
Tim Stewart

43

Wie liste ich nur Unterverzeichnisse im aktuellen auf?

ls -d */

Es ist ein einfacher Trick, aber Sie würden nicht wissen, wie viel Zeit ich brauchte, um diesen zu finden!


2
Ausgezeichnet! In all den Jahren war das Beste, was ich mir einfallen lassen konnte alias lsd='ls -F | grep --color /', dasselbe aufzulisten, aber lahmer. Es würde jedoch ein Verzeichnis pro Zeile auflisten, um das Parsen zu vereinfachen. Ich habe Ihren Befehl geändert, um dasselbe zu tun:ls -d1 */
Artem

wie funktioniert das? "ls -d" listet nur. (was seltsam ist) aber "ls -d * /" funktioniert.
Yoo

1
Es ist ein bisschen knifflig ... "ls -d" ähnelt "ls -d ./" und "ls -d /" "ls -d ./*/". Der Schalter '-d' setzt 'ls', um nur Verzeichniseinträge aufzulisten. Wenn Sie ihm jedoch keinen Parameter geben, wird das aktuelle Verzeichnis als Parameter verwendet, sodass * nur das "." Verzeichnis zu listen ...
Edomaur

1
Ich kann nicht glauben, dass ich das noch nie entdeckt habe. Toller Tipp.
Nick Dixon

Keine Worte, nur wow !!! :)
Dimba

41

ESC.

Fügt die letzten Argumente aus Ihrem letzten Bash-Befehl ein. Es ist nützlicher als Sie denken.

cp file /to/some/long/path

CD ESC.


Das funktioniert bei mir (Bash). Beachten Sie, dass Sie die Esc-Taste und dann die Punkt-Taste drücken. Kein Bindestrich oder so.
Howler

9
Auch alt-. ist das gleiche.
Mark Baker

Ja, es ist nur Bash. Aber <esc> (oder Alt- oder Meta-) _ ist an dieselbe Funktion gebunden, und <esc> -_ funktioniert auch im vi-Modus.
Nick Dixon

@endry in meinem zsh funktioniert es tatsächlich. Vielleicht benutzt du den vi-Modus?
ZyX

Verwenden Sie das kbd-Tag für Tastaturtreffer: <kbd> ESC </ kbd> (spielt aber zusammen mit Code-Formatierung / Einrückung nicht sehr gut).
Benutzer unbekannt

36

Sicher, Sie können " diff file1.txt file2.txt", aber Bash unterstützt die Prozessersetzung , die es Ihnen ermöglichtdiff Befehle ausgeben können.

Angenommen, ich möchte sicherstellen, dass mein Skript die erwartete Ausgabe liefert. Ich kann mein Skript einfach in <() einwickeln und es füttern diff, um einen schnellen und schmutzigen Komponententest zu erhalten:

$ 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
$

Nehmen wir als weiteres Beispiel an, ich möchte überprüfen, ob auf zwei Servern dieselbe Liste von RPMs installiert ist. Anstatt auf jeden Server zu sshen, jede Liste von RPMs in separate Dateien zu schreiben und diffdiese Dateien zu bearbeiten , kann ich einfach Folgendes diffvon meiner Workstation aus tun :

$ 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
$

Weitere Beispiele finden Sie im Advanced Bash-Scripting Guide unter http://tldp.org/LDP/abs/html/process-sub.html .


35

Mein Lieblingsbefehl ist "ls -thor"

Es ruft die Macht der Götter dazu auf, die zuletzt geänderten Dateien in einem bequem lesbaren Format aufzulisten.


6
Erinnert mich an einen anderen, völlig nutzlosen, aber auch lustigen Befehl : ls -bart -simpson -ruls. S, ICNR
Filiprem

'ls -tor' ist auch nützlich, da Sie große Dateien schnell finden können. Außerdem lautet die ursprüngliche schwedische Schreibweise des Namens des Donnergottes "Tor".
dala

Auf Dänisch können Sie ls -lortdas dänische Wort für "Scheiße" verwenden. Auslassen von Gruppen und nicht den Zorn von Valhal bekommen :)
Jesper Rønn-Jensen

1
man könnte es auch wie "ls -lotr" sagen, was anscheinend etwas mit Tolkien und Lord Of The Rings zu tun hat :)
ADEpt

28

Eher eine Neuheit, aber es ist klug ...

Top 10 verwendete Befehle:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

Beispielausgabe:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi

1
Hier ist eine kürzere, schnellere Version:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Bis auf weiteres angehalten.

25

^ R umgekehrte Suche. Drücken Sie ^ R, geben Sie ein Fragment eines vorherigen Befehls ein, dem Sie entsprechen möchten, und drücken Sie ^ R, bis Sie den gewünschten gefunden haben. Dann muss ich mich nicht an kürzlich verwendete Befehle erinnern, die sich noch in meiner Geschichte befinden. Nicht ausschließlich bash, sondern auch: ^ E für das Zeilenende, ^ A für den Zeilenanfang, ^ U und ^ K zum Löschen vor bzw. nach dem Cursor.


2
Ich kann mich aus irgendeinem Grund nie an ^ U erinnern. Gibt es nicht auch eine Verknüpfung zum Löschen von Wörtern?
Hoyhoy

1
^ W löscht das Wort vor dem Cursor. (Fühlen Sie sich frei, Ihre Antwort damit zu bearbeiten.)
Jon Ericson

2
^ R ist so nützlich, dass es in der Frage erwähnt wurde :)
Mark Baker

20

Ich habe oft Aliase für vi, ls usw., aber manchmal möchten Sie dem Alias ​​entkommen. Fügen Sie dem Befehl vorne einfach einen Schrägstrich hinzu:

Z.B:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

Cool, nicht wahr?


Sie können auch ausführen - commandsiehe SHELL BUILTIN COMMANDSim Bash-Handbuch.
Island_jack

17

Hier sind einige Konfigurationsänderungen:

~/.inputrc::

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

Dies funktioniert genauso, verwendet ^Rjedoch stattdessen die Pfeiltasten. Dies bedeutet, dass ich (z. B.) tippen und cd /media/dann den Aufwärtspfeil drücken kann, um zum letzten Element cdim /media/Ordner zu gelangen.

(Ich verwende Gnome Terminal. Möglicherweise müssen Sie die Escape-Codes für andere Terminalemulatoren ändern.)

Bash-Vervollständigung ist ebenfalls unglaublich nützlich, aber eine weitaus subtilere Ergänzung. In ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Dadurch wird die Tab-Vervollständigung pro Programm aktiviert (z. B. der Versuch, die Tabs zu vervollständigen, wenn die Befehlszeile mit beginnt evince , nur Dateien angezeigt, die nachweislich geöffnet werden können, und es werden auch Befehlszeilenoptionen zum Tab-Vervollständigen angezeigt).

Funktioniert gut damit auch in ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

+1 bash_completion ist fantastisch
Prestomation

Auf einem Mac kann die Verlaufssuche mit Pfeiltasten aktiviert werden mit: bind '"\ e [A"': Verlaufssuche rückwärts binden '"\ e [B"': Verlaufssuche vorwärts
Asmus

17

Ich benutze oft Folgendes:

Der :pModifikator zum Drucken eines Verlaufsergebnisses. Z.B

!!:p

Gibt den letzten Befehl aus, damit Sie überprüfen können, ob er korrekt ist, bevor Sie ihn erneut ausführen. !!Geben Sie einfach ein , um es auszuführen.

In ähnlicher Weise:

!?foo?:p

Durchsucht Ihren Verlauf nach dem neuesten Befehl, der die Zeichenfolge 'foo' enthält, und druckt ihn aus.

Wenn Sie nicht drucken müssen,

!?foo

führt die Suche durch und führt sie sofort aus.


2
Anstatt: p zu verwenden, können Sie auch magic-space verwenden: stackoverflow.com/questions/603696/…
Yoo

die historischen Kontrollen ohne Lauf confiure Magick-Raum in bashrc zu erweiternbind Space:magic-space # !pin<space>
SergioAraujo

16

Ich habe eine Geheimwaffe: Shell-Fu.

Es gibt Tausende von intelligenten Tipps, coolen Tricks und effizienten Rezepten, die meistens in eine einzelne Zeile passen.

Eine, die ich liebe (aber ich betrüge ein bisschen, da ich die Tatsache benutze, dass Python jetzt auf den meisten Unix-Systemen installiert ist):

alias webshare='python -m SimpleHTTPServer'

Jedes Mal, wenn Sie "webshare" eingeben, ist das aktuelle Verzeichnis über den Port 8000 verfügbar. Sehr schön, wenn Sie Dateien ohne USB-Schlüssel oder Remote-Verzeichnis mit Freunden in einem lokalen Netzwerk teilen möchten. Das Streamen von Videos und Musik funktioniert ebenfalls.

Und natürlich die klassische Gabelbombe, die völlig nutzlos ist, aber trotzdem viel Spaß macht:

$ :(){ :|:& };:

Versuchen Sie das nicht auf einem Produktionsserver ...


Ich denke, ich sollte nicht webshare /
Yoo

Ich denke, Sie können den Befehl vereinfachen python -m SimpleHTTPServer(es sei denn, ich vermisse etwas Besonderes, das der ursprüngliche Befehl tut
Jesper Rønn-Jensen

Meh. Auf einem Produktionsserver wird diese Gabelbombe nur vom Betriebssystem unterdrückt. Die Anzahl der Prozesse, die jeder Benutzer erstellen kann, ist begrenzt.
Donal Fellows

3
@Donal: Sie sollten es versuchen und Ihre Ergebnisse melden.
Michael Foukarakis

12

Sie können den Befehl watch in Verbindung mit einem anderen Befehl verwenden, um nach Änderungen zu suchen. Ein Beispiel hierfür war, als ich meinen Router testete und aktuelle Zahlen zu Themen wie Signal-Rausch-Verhältnis usw. erhalten wollte.

watch --interval=10 lynx -dump http://dslrouter/stats.html

Der Befehl watch ist wirklich cool. Ich habe vor ungefähr fünf Jahren zum ersten Mal im Linux Server Hacks-Buch darüber gelesen. Wer wusste, dass es existiert?
Hoyhoy

11
Was in aller Welt hat "gucken" mit Bash zu tun?
Artem Russakovskii

11
type -a PROG

um alle Stellen zu finden, an denen PROG verfügbar ist, normalerweise irgendwo in ~ / bin und nicht in / usr / bin / PROG, die möglicherweise erwartet wurden.


1
Außerdem erfahren Sie, ob es sich um eine Funktion oder einen Alias ​​handelt. Wenn es sich an mehreren Stellen in Ihrem befindet PATH, wird jeder von ihnen angezeigt.
Bis auf weiteres angehalten.

11

Ich konstruiere gerne Befehle mit Echo und leite sie an die Shell weiter:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

Warum? Weil es mir erlaubt zu sehen, was getan wird, bevor ich es tue. Auf diese Weise kann ich einen schrecklichen Fehler (z. B. das Entfernen meines Home-Verzeichnisses) abfangen, bevor er auftritt. Dies ist natürlich am wichtigsten für destruktive oder unwiderrufliche Handlungen.


1
Möglicherweise möchten Sie find -print0 und xargs -0 verwenden, um Probleme mit Dateien und Ordnern mit Leerzeichen zu vermeiden.
Neu242

Oder vermeiden Sie das Erstellen und Arbeiten mit Dateien und Ordnern, deren Namen Leerzeichen enthalten. ;-) Wenn Sie mit benutzergenerierten Namen arbeiten, ist Ihr Vorschlag natürlich von entscheidender Bedeutung.
Jon Ericson

4
Warum würden Sie "| ksh -s" anhängen, wenn Sie nur das "Echo" entfernen könnten?
Yoo

Keine Notwendigkeit, mit GNU zu $ find dir -name \\*~ -exec rm {} +
pfeifen zu

10

Beim Herunterladen einer großen Datei mache ich ziemlich oft:

while ls -la <filename>; do sleep 5; done

Und dann einfach Strg + C, wenn ich fertig bin (oder wenn ls ungleich Null zurückgegeben wird). Es ähnelt dem watchProgramm, verwendet jedoch stattdessen die Shell, sodass es auf Plattformen ohne funktioniertwatch .

Ein weiteres nützliches Tool ist netcat oder nc. Wenn Sie tun:

nc -l -p 9100 > printjob.prn

Anschließend können Sie einen Drucker auf einem anderen Computer einrichten, aber stattdessen die IP-Adresse des Computers verwenden, auf dem Netcat ausgeführt wird. Wenn der Druckauftrag gesendet wird, wird er von dem Computer empfangen, auf dem netcat ausgeführt wird, und in den er ausgegeben wird printjob.prn.


Warum das und nicht zum Beispiel wget?
porges

Versuchen Sie es watch ls -la <filename>(verwenden Sie -n5, wenn Ihnen die Standardeinstellung von 2 Sekunden nicht gefällt).
Ted Percival

1
@Ted watchist jedoch nicht auf allen Plattformen verfügbar, z. B. Solaris, Mac OS X usw. @Porges, nicht sicher, was Sie meinen. Kann wget auch einen Port abhören?
Dreamlax


10

Eine bevorzugte Art der Navigation, wenn ich mehrere Verzeichnisse an weit voneinander entfernten Stellen in einer Baumhierarchie verwende, ist die Verwendung von acf_func.sh (siehe unten). Einmal definiert, können Sie tun

cd -

um eine Liste der letzten Verzeichnisse mit einem numerischen Menü anzuzeigen

cd -2

um zum zweitletzten Verzeichnis zu gelangen.

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

10

Erweitern Sie komplizierte Zeilen, bevor Sie die gefürchtete Eingabe treffen

  • Alt+ Ctrl+ e- Shell-expand-Linie (zu verwenden müssen Esc, Ctrl+ eauf der Tastatur)
  • Ctrl+ _- rückgängig machen
  • Ctrl+ x, *- glob-expand-word

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

& c.


+1, ich habe immer Angst vor dem Drücken Enter:)
João Portela

Wusste nichts davon. Rückgängig machen ist ein Killer. Gut für jede Befehlszeilenbearbeitung.
Philippe A.

9

Ich war schon immer parteiisch bei:

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 zu allgemeinen Verzeichnissen erstellen. Für den Quellbaum meines Unternehmens erstelle ich eine Reihe von Variablen wie:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

dann kann ich durch in dieses Verzeichnis wechseln cd Dcentmain.


Home und End machen die gleichen Dinge wie crtl-A und ctrl-E.
Davidfg4

Dies hilft auf Mac-Laptops ohne Home- und End-Taste.
Jamesh

Leider ist Strg-A screenstandardmäßig auch die Escape-Taste . Ich ordne es Strg-X in meinem neu zu .screenrc, aber dann bin ich kein Emacs-Benutzer.
System PAUSE

Etwas im Zusammenhang mit der Option cdable_vars gibt es auch die Umgebungsvariable CDPATH. Dies funktioniert jedoch anders, da Sie das übergeordnete Verzeichnis ähnlich wie in PATH festlegen. Mit cdable_vars erhalten Sie mehr Kontrolle.
Zecc

1
Mehr für Ihre Verknüpfungsliste: STRG + K, um alles vom Cursor bis zum Zeilenende zu löschen, STRG + U, um alles vor dem Cursor zu löschen, ALT + F / ALT + B, um ein Wort vorwärts / rückwärts zu bewegen (oder STRG + Pfeil nach links / STRG) + Pfeil nach rechts). +1 für cdable_vars!
Philippe A.

8

pbcopy

Dies wird in die Zwischenablage des Mac-Systems kopiert. Sie können Befehle an diese weiterleiten ... versuchen Sie:

pwd | pbcopy


NB! Dies ist ein Mac-spezifischer Befehl.
Dala

Dies sind nicht: alias pbcopy='xsel --clipboard --input' und alias pbpaste='xsel --clipboard --output'
wawawawa

7
$ 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

Verwenden Sie history 10statt history | tail -10(was tail -n 10übrigens sein sollte, da diese Syntax veraltet ist).
Bis auf weiteres angehalten.

7

Wenn Sie 'set -o vi' über die Befehlszeile oder besser in .bashrc verwenden, gelangen Sie in der Befehlszeile in den vi-Bearbeitungsmodus. Sie starten im Einfügemodus, damit Sie wie gewohnt tippen und die Rücktaste drücken können. Wenn Sie jedoch einen großen Fehler machen, können Sie die Esc-Taste drücken und sich dann wie in vi mit 'b' und 'f' bewegen. cw um ein Wort zu ändern. Besonders nützlich, nachdem Sie einen Verlaufsbefehl aufgerufen haben, den Sie ändern möchten.


7

Ähnlich wie bei vielen oben ist mein aktueller Favorit der Tastenanschlag [alt]. (Alt und "." Tasten zusammen) Dies ist das gleiche wie $! (Fügt das letzte Argument aus dem vorherigen Befehl ein), außer dass es unmittelbar und für mich einfacher zu tippen ist. (Kann einfach nicht in Skripten verwendet werden)

z.B:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

Versuchen Sie auch, es mit Alt- [0-9] zu kombinieren (drücken Sie die erste Kombination, lassen Sie sie los und dann die zweite). zB wenn der letzte Befehl 'mv foo bar' war, dann "Alt-0 Alt-". gibt 'mv', "Alt-1 Alt-". gibt 'foo', "Alt-2 Alt-". und grundlegende Alt-. beide geben 'bar' usw.
Sam Stokes

1
Versuchen Sie auch, Alt- zu drücken. mehr als einmal (oder drücken Sie Alt, halten Sie es dort gedrückt, drücken Sie mehrmals auf Punkt und lassen Sie dann Alt los) Dies ähnelt dem mehrmaligen Drücken von Strg-R.
Yoo

7

Fügen Sie mehrere Befehle mit dem Befehl && zusammen :

./run.sh && tail -f log.txt

oder

kill -9 1111 && ./start.sh

1
Wenn einer fehlschlägt, wird der andere Befehl nicht ausgeführt (schnell fehlgeschlagen, wie in der Programmierung)
Frederic Morin

1
Das Gegenteil ist, das logische oder '||' zu verwenden. bei dem die rechte Seite nur ausgeführt wird, wenn die linke Seite falsch ist. Beispiel: <code> command_1 || command_2 </ code>
dala
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.