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?

Robert Harvey
quelle
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

user10765
quelle
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).

Mark Biek
quelle
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 !!
amrox
quelle
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

Seth
quelle
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

Jiaaro
quelle
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
Pi.
quelle
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 ""
Hoyhoy
quelle
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!

Edomaur
quelle
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.

amrox
quelle
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 .

Philip Durbin
quelle
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.

user10109
quelle
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
ctcherry
quelle
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.

user10741
quelle
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?

Srikanth
quelle
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
Porges
quelle
+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.

Steve Lacey
quelle
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 ...

E-Satis
quelle
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
HFLW
quelle
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.

dajobe
quelle
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.

Jon Ericson
quelle
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.

Dreamlax
quelle
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

pushdund popdfast immer nützlich sein

jdt141
quelle
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
Leonard
quelle
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.

Bobbogo
quelle
+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.

Drew Frezell
quelle
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

Max Masnick
quelle
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
Allan Wind
quelle
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.

Leonard
quelle
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].
user11535
quelle
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
TChen
quelle
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