Was sind Ihre bevorzugten Befehlszeilenfunktionen oder -tricks?


94

Teilen Sie Ihre Befehlszeilenfunktionen und Tricks für Unix / Linux. Versuchen Sie, es wenn möglich Shell / Distribution-unabhängig zu halten. Sie interessieren sich für Aliase, Einzeiler, Tastaturkürzel, kleine Shell-Skripte usw.

Antworten:


89

Dies erweitert etwas den !!in dieser Antwort erwähnten Trick . Tatsächlich gibt es eine Reihe von geschichtsbezogenen Befehlen, die in Vergessenheit geraten (Menschen neigen dazu, Up100-mal zu stechen, anstatt nach einem Befehl zu suchen, von dem sie wissen, dass sie ihn eingegeben haben).

  • Der historyBefehl zeigt eine Liste der zuletzt ausgeführten Befehle mit einem Ereignisbezeichner links an
  • !N Ersetzt den Befehl, der dem Ereignisbezeichner zugeordnet ist N
  • !-Ndas ersetzen N th letzten Befehl; Ersetzt z. B. !-1den letzten Befehl, !-2den zweitletzten usw.
  • Wie in der anderen Antwort erwähnt, !!steht die Abkürzung für !-1, um den letzten Befehl schnell zu ersetzen
  • !string ersetzt den neuesten Befehl, der mit beginnt string
  • !?string? ersetzt den aktuellsten Befehl, der enthält string

Einem !Verlaufsbefehl können Wortbezeichner hinzugefügt werden , um die Ergebnisse zu ändern. Ein Doppelpunkt trennt die Ereignis- und Wortbezeichner, z !!:0. Der Ereigniskennzeichner !!kann nur !bei Verwendung eines Wortkennzeichners abgekürzt werden , !!:0ist also äquivalent zu !:0.

  • !:0 wird den Befehl erhalten, der ausgeführt wurde
  • !:1wird das erste Argument bekommen (und !:2das zweite, etc.)
  • !:2-3 wird das zweite und dritte Argument bekommen
  • !:^ist ein weiterer Weg, um das erste Argument zu bekommen. !:$werde das letzte bekommen
  • !:*bekommt alle Argumente (aber nicht den Befehl)

Modifikatoren können auch an einen !Verlaufsbefehl angehängt werden , dem jeweils ein Doppelpunkt vorangestellt ist. Es kann eine beliebige Zahl aufgestapelt werden (zB !:t:r:p).

  • h - Richten Sie sich nach dem Basisdateinamen aus
  • t - Nur der Basisdateiname
  • r - Richten Sie die Dateinamenerweiterung aus
  • e - Nur die Dateinamenerweiterung
  • s/search/replacement- Ersetzen Sie das erste Vorkommen von searchdurchreplacement
  • gs/search/replacement- Ersetzen Sie alle Vorkommen von searchdurchreplacement

3
Und wenn Sie Bash verwenden (könnte für bestimmte andere Shells dasselbe sein), erweitert M- ^ (Meta- ^) die obigen Operatoren für die Verlaufserweiterung für Sie, nur für den Fall, dass Sie sehen möchten, worauf Sie sich tatsächlich beziehen zu.
Eric Smith

1
Ich habe noch nie eine Verwendung für das gefunden! befehle Dinge. Es scheint mir nur schlecht, einen Befehl auszuführen, den ich nicht sehe. Es wäre so einfach,! -3 statt! -4 einzugeben, und wer weiß, was passieren könnte. Das Finden der Zeilennummer des Befehls, den ich ausführen möchte, ist normalerweise mehr ein Schmerz als es wert ist. Coole Tricks, aber ich habe nie eine wirkliche Verwendung für sie gefunden.
Falmarri

1
@ Falmarri Ich benutze die !-#auch nie . Ich !stringführe zwar den letzten Befehl aus, der mit einem String beginnt, führe ihn jedoch in der Regel mit einem Tabulator (zsh) aus, um sicherzustellen, dass ich das Richtige ausführe
Michael Mrozek

1
Nein! :) "Running !Nführt den Befehl aus ..." ist eine zu enge Beschreibung. wird tatsächlich !Ndurch den Befehl ersetzt ...; und so weiter für alle Beschreibungen in der Antwort. Richtiger und eröffnen viel nützlichere Möglichkeiten! ZB das erwähnte sudo !!.
imz - Ivan Zakharyaschev

1
Um frühere Befehle auszuführen, die nach einer Zeichenfolge durchsucht wurden, drücke ich normalerweise nur Strg-R. Mehrfache Strg-R-Taste vertieft den Verlauf. Auf diese Weise sehe ich den gefundenen Befehl sofort und kann ihn verwerfen und weiter suchen. Ctrl-G verlässt diesen Modus. Der einzige Nachteil ist, dass Strg-R für ist bash; In Emacs verwendet man stattdessen Meta-R (Meta-R wird auch eshellin Emacs verwendet) , um die Historie der Eingabebefehle und -werte (für Mx oder andere gelesene Werte) zu durchsuchen . Also vermassle ich sie oft.
imz - Ivan Zakharyaschev

65

bash - füge den letzten Parameter der vorhergehenden Zeile ein

alt- . die nützlichste Tastenkombination aller Zeiten, probieren Sie es aus und sehen Sie, aus irgendeinem Grund weiß niemand etwas über diese.

Drücken Sie sie immer wieder, um ältere letzte Parameter auszuwählen.

ideal, wenn Sie etwas mehr mit dem Argument / der Datei machen möchten, das / die Sie gerade verwendet haben.


11
Sie können auch! $ Verwenden, um auf das letzte Argument im vorherigen Befehl zu verweisen. Dies ist nützlich, da es sowohl in Skripten als auch interaktiv funktioniert. (Arbeitet in Bash & Zsh)

4
Jedes Mal , wenn Sie treffen alt- .es wird zum vorherigen Befehl gehen und das letzte Argument daraus ziehen. Wenn Sie also das letzte Argument von vor drei Befehlen wollen, drücken Sie einfach alt- .dreimal.
Clee

2
Dies ist die Standardschlüsselbindung für den yank-last-argBefehl readline. Sie sollte daher mit jedem Programm funktionieren, das mit readline verknüpft ist, nicht nur mit BASH oder ZSH.
James Sneeringer

Im vi-Modus musste ich yank-last-arg wie folgt neu binden: superuser.com/questions/18498/…
Jeromy Anglim

In xterm, meta-. Produziert ®, aber Sie können esc anstelle von meta verwenden (im Allgemeinen in bash), also esc-. stattdessen.
Derobert

49

Mein Liebling ist

man 7 ascii

Einfach und sehr nützlich.

   Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
   ────────────────────────────────────────────────────────────────────────
   000   0     00    NUL '\0' (null character)   100   64    40    @
   001   1     01    SOH (start of heading)      101   65    41    A
   002   2     02    STX (start of text)         102   66    42    B
   003   3     03    ETX (end of text)           103   67    43    C
   004   4     04    EOT (end of transmission)   104   68    44    D
   005   5     05    ENQ (enquiry)               105   69    45    E
   006   6     06    ACK (acknowledge)           106   70    46    F
   007   7     07    BEL '\a' (bell)             107   71    47    G
   010   8     08    BS  '\b' (backspace)        110   72    48    H
   011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
   012   10    0A    LF  '\n' (new line)         112   74    4A    J
   013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
   014   12    0C    FF  '\f' (form feed)        114   76    4C    L
   015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
   016   14    0E    SO  (shift out)             116   78    4E    N
   017   15    0F    SI  (shift in)              117   79    4F    O
   020   16    10    DLE (data link escape)      120   80    50    P
   021   17    11    DC1 (device control 1)      121   81    51    Q
   022   18    12    DC2 (device control 2)      122   82    52    R
   023   19    13    DC3 (device control 3)      123   83    53    S
   024   20    14    DC4 (device control 4)      124   84    54    T
   025   21    15    NAK (negative ack.)         125   85    55    U
   026   22    16    SYN (synchronous idle)      126   86    56    V
   027   23    17    ETB (end of trans. blk)     127   87    57    W
   030   24    18    CAN (cancel)                130   88    58    X
   031   25    19    EM  (end of medium)         131   89    59    Y
   032   26    1A    SUB (substitute)            132   90    5A    Z
   033   27    1B    ESC (escape)                133   91    5B    [
   034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
   035   29    1D    GS  (group separator)       135   93    5D    ]
   036   30    1E    RS  (record separator)      136   94    5E    ^
   037   31    1F    US  (unit separator)        137   95    5F    _
   040   32    20    SPACE                       140   96    60    `
   041   33    21    !                           141   97    61    a
   042   34    22    "                           142   98    62    b
   043   35    23    #                           143   99    63    c
   044   36    24    $                           144   100   64    d
   045   37    25    %                           145   101   65    e
   046   38    26    &                           146   102   66    f
   047   39    27    '                           147   103   67    g
   050   40    28    (                           150   104   68    h
   051   41    29    )                           151   105   69    i
   052   42    2A    *                           152   106   6A    j
   053   43    2B    +                           153   107   6B    k
   054   44    2C    ,                           154   108   6C    l
   055   45    2D    -                           155   109   6D    m

   056   46    2E    .                           156   110   6E    n
   057   47    2F    /                           157   111   6F    o
   060   48    30    0                           160   112   70    p
   061   49    31    1                           161   113   71    q
   062   50    32    2                           162   114   72    r
   063   51    33    3                           163   115   73    s
   064   52    34    4                           164   116   74    t
   065   53    35    5                           165   117   75    u
   066   54    36    6                           166   118   76    v
   067   55    37    7                           167   119   77    w
   070   56    38    8                           170   120   78    x
   071   57    39    9                           171   121   79    y
   072   58    3A    :                           172   122   7A    z
   073   59    3B    ;                           173   123   7B    {
   074   60    3C    <                           174   124   7C    |
   075   61    3D    =                           175   125   7D    }
   076   62    3E    >                           176   126   7E    ~
   077   63    3F    ?                           177   127   7F    DEL

Schauen Sie sich diese Website an: commandlinefu.com .

Sie können sich auch diese vier Artikel von Peteris Krumins in seinem Blog ansehen


2
Das separate ascii Programm ist ebenfalls nützlich. Neben dem Drucken einer Tabelle können Sie auch einzelne Zeichen abfragen.
Matthew Flaschen


42

Ich bin nicht sicher, ob dies als "Trick" gilt, aber die Leute scheinen die Standard-Readline-Hotkeys nicht zu kennen. Von besonderem Nutzen in Muscheln:

  • Ctrl+ U- Aktuelle Zeile ausschneiden
  • Ctrl+ Y- Füge eine mit Ctrl+ ausgeschnittene Linie einU
  • Ctrl+ L- Löscht den Bildschirm und zeichnet die aktuelle Zeile neu
  • Ctrl+ G- Holen Sie sich eine neue Zeile und verlassen Sie die aktuelle

5
Um ein paar zu ergänzen: Strg + A, um zum Zeilenanfang zu gelangen, Strg + E, um zum Zeilenende zu gelangen, Strg-K, um vom Cursor zum Zeilenende zu gelangen.
rsuarez

Ctrl+Lentspricht dem FormFeed-ASCII-Zeichen. Normalerweise wird der Bildschirm in Textanwendungen mit einem Bildschirmfenster (z. B. vim, less, mc usw.) neu gezeichnet. Schön, wenn der Bildschirm durch eine Ausgabe eines anderen Programms "verschmutzt" wurde.
hlovdal

Hinzufügen zur Liste des Hot-Keys: Ctrl+Wein Wort rückwärts zu schneiden, Alt+Fzu gehen , um ein Wort vorwärts, Alt+Bum ein Wort rückwärts in einer Linie zu gehen. Ich mag Ctrl+Yund Shift+Insertweil du zwei kopierte Zeilen haben kannst. Eins mit Ctrl+U(Einfügen mit Ctrl+Y) und gleichzeitig können Sie ein anderes Wort kopieren (Zeile auswählen) Einfügen mit ( Shift+Insert).

36

CTRL+ Rin BASH zum Suchen / Aktivieren von zuvor ausgeführten Befehlen (der Inhalt von ~ / .bash_history).

Dies ist oft sehr hilfreich. Wenn Sie diesen Alias ​​ausführen, wird die PWD über HTTP (indiziert) auf Port 8000 bereitgestellt:

alias webserver="python -m SimpleHTTPServer"

Und weil ich laufe, die ganze Zeit mache und zu schnell spaziere und tippe, sind diese Aliase wahrscheinlich meine am häufigsten verwendeten (ernsthaften):

alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make

Und mein wahrscheinlich am häufigsten verwendetes Stück BASH ist ein einfaches Skript, das ich Upload nenne. Ich verwende es, um jegliche Art von Inhalten auf meinen Linode zu übertragen, und kopiere die resultierende HTTP-URL in meine Zwischenablage (mittlerer Klick). Sehr nützlich zum Einfügen von Inhalten in IRC-Benutzer:

scp -r $* $user@$host:public_html && {
    URL="http://$host/~$user/$(basename $1)"
    echo "$URL"
    xselection -replace PRIMARY "$URL"
}

Nur ein Paar. Ich kann später viel mehr posten, muss mich wieder an die Arbeit machen!


8
alias mk=makeSchneller zu tippen und weniger wahrscheinlich falsch zu liegen. Oder kompilieren Sie mit einem Hotkey aus Ihrem Editor ...
Lars Haugseth

BTW Zsh verfügt über eine integrierte Rechtschreibkorrektur, mit der sich einfache Tippfehler sehr gut korrigieren lassen.
Adam Byrtek

Auch in zsh ist die Standardeinstellung, wenn Sie die Aufwärtstaste drücken, eine Verlaufssuche, als hätten Sie Strg + R gedrückt. Könnte nicht der Standard sein, aber es ist eine Einstellung.
Falmarri

Ich würde überlegen alias m=make, oder sogar m=make -j6oder ähnlich - außer ich benutze bereits alias m=mutt
jmtd

31

diff die Ausgabe von zwei Befehlen ohne manuelle Erstellung einer temporären Datei (bash):

diff <(ls dir1) <(ls dir2)

Dies ist auch sehr nützlich, commda nur Dateien benötigt werden, aber in vielen Fällen ist dies eine Verschwendung von Inodes.
Marcin

30

Ziemlich einfach, aber die Leute scheinen es nicht zu wissen, und Sie kehren zum vorherigen Verzeichnis zurück:

cd -

Ich sage Ihnen, cd..von DOS ist in meinem Muskelgedächtnis verankert ...
LawrenceC

Dies ist eine billige Version von Pushd und Popd, obwohl ...
Robert Massaioli

Ebenso gibt es cd(ohne Argument), die Sie zu Ihrem Home-Verzeichnis führt.
Mei

Ja, das ist verrückt. Wo in der Manpage wird die Erweiterung von '-' angezeigt? Ich versuche immer (und vergesse), Pushd / Popd zu verwenden
Chuck R

29

Klammererweiterung :

Die Klammererweiterung ist ein Mechanismus, mit dem beliebige Zeichenfolgen generiert werden können.

Sie können damit mühsame Zeilen ersetzen wie:

mv loong/and/complex/file/name loong/and/complex/file/name.bacukup

mit einer kürzeren Instanz

mv loong/and/complex/file/name{,backup}

einige andere Verwendungen

# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}

# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share 

Arithmetische Erweiterung :

Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Substitution des Ergebnisses. Das Format für die arithmetische Erweiterung lautet:

$((expression))

Der Ausdruck wird so behandelt, als befände er sich in doppelten Anführungszeichen, ein doppeltes Anführungszeichen in Klammern wird jedoch nicht speziell behandelt. Alle Token im Ausdruck werden einer Parametererweiterung, einer Zeichenfolgenerweiterung, einer Befehlssubstitution und einer Entfernung von Anführungszeichen unterzogen. Arithmetische Erweiterungen können verschachtelt sein.

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5

3
Schön, ich kann nicht glauben, dass ich das vergessen habe. Es gibt auch eine kompaktere Version foo[123], die erweitert wird foo1 foo2 foo3, aber es müssen Dateinamen sein, um in diesem Fall zu funktionieren
Michael Mrozek

hehe .. danke ... lerne jeden Tag etwas +1
Stefan

29

Dies ist normalerweise in meinem Startskript (.bashrc, .profile, was auch immer)

shopt Meine Güte, überprüfen Sie die Kommentare:

shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames

Ein Alias, der Tastatureingaben speichert: mkdirund cdhinein:

mkcd () { mkdir -p "$@" && cd "$@"; }

Und zu guter Letzt habe ich es aufgegeben, mir die TAR-Syntax zu merken.

extract () {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)  tar xjf $1      ;;
            *.tar.gz)   tar xzf $1      ;;
            *.bz2)      bunzip2 $1      ;;
            *.rar)      rar x $1        ;;
            *.gz)       gunzip $1       ;;
            *.tar)      tar xf $1       ;;
            *.tbz2)     tar xjf $1      ;;
            *.tgz)      tar xzf $1      ;;
            *.zip)      unzip $1        ;;
            *.Z)        uncompress $1   ;;
            *)          echo "'$1' cannot be extracted via extract()" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}

5
+1, warum habe ich nicht daran gedacht? (Auszug)
MAK

Ich habe eine ähnliche Funktion mkcdnur, dass ich ID benenne md. Die Verwendung von "$ @" als Argument für cd macht jedoch keinen Sinn, da Sie nicht in mehr als ein einziges Verzeichnis cd können. "$ @" wird für mkdir funktionieren, aber dann behandeln Sie Argumente für mkdir und cd anders, also würde ich eher vorschlagenmd () { mkdir -p "$1"; cd "$1" }
hlovdal

Wie füge ich diese Befehle hinzu? einfach einfügen wie es ist zu .bashrc oder "alias" vor ihnen hinzufügen?
Asaf

22

Zwei Bash-Funktionen, die mir viele Tastenanschläge ersparen.

Mache nach jeder erfolgreichen CD automatisch ein ls:

function cd {
    builtin cd "$@" && ls
}

Gehe auf n Ebenen:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}

4
Mir ist nie klar geworden builtin foo, dass man eine definierte Funktion umgehen kann cd. Ich habe chdirin meinen Funktionen verwendet. Handy
Michael Mrozek

Genial. Füge einfach -F zu ls in der CD-Funktion hinzu und es ist perfekt (für mich)!
Frabjous

2
Ich mache dasselbe wie du für die CD, aber ich habe ein paar mehr Vernunftsprüfungen und vermeide es, ls im nicht interaktiven Modus zu machen:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd

17

Da ich normalerweise auf halber Strecke in einer Befehlszeile bin, bevor ich suchen möchte (STRG-R in Bash), habe ich Folgendes in meinem .bashrc

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

Das bedeutet, wenn ich cd eingebe und dann hoch / runter drücke, kann ich alle Optionen sehen, die ich für cd hatte. Grundsätzlich benutze ich dies für häufig verwendete Verzeichnisse. Wie "cd w" und am Ende gehe ich alle Arbeitsbereiche durch, die ich viel benutze.


Dieser ist wirklich toll! Es erweitert das Verhalten der Pfeile, ohne deren grundlegende Funktionalität zu beeinträchtigen. Danke!
Philfr

17

Eine Sache, die mir viel Zeit spart, sind die pushd / popd-Befehle. Mit diesen Typen können Sie einen Stapel von Verzeichnissen erstellen und das Tippen erheblich reduzieren:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make

2
Ja! alias u = pushd; alias o = popd
cannedprimates

2
.. und was tun uund ofür hier stehen?
Deizel

@deizel: Nichts Bestimmtes, nur eine Abkürzung, um das Tippen zu vermeiden.
Adam Byrtek

2
Sieht aus wie der zweite Buchstabe des Befehls, da beide mit p beginnen, können Sie das nicht für beide verwenden.
16.09.10

In ZSH können Sie setopt autopushdund alle Verzeichnisänderungen werden automatisch Push
Michael Mrozek

14

Der screen Befehl . Grundsätzlich wird Ihre Befehlszeilensitzung für den Zeitpunkt Ihrer Rückkehr gespeichert. Es ist eine Art Terminalmanager, wie ein Fenstermanager. Auf diese Weise können in einer einzelnen Terminalsitzung mehrere virtuelle Terminals ausgeführt werden. Es ist sehr cool.

Wenn man es benutzt screen, ist diese Shell-Funktion .bashrcextrem nützlich:

function scr {
    if screen -ls | grep -q Main; then
         # reattach to Main: 
         screen -xr Main
    else
         # name session "Main":
         screen -S Main
    fi
   }

Nach der Eingabe scrwird überprüft, ob Ihre Hauptsitzung vorhanden ist, und es wird eine Verbindung dazu hergestellt. Andernfalls wird es erstellt.


technisch gesehen ist es ein eigenständiges Programm, kein "Befehl".
unperson325680

1
Ich würde empfehlen, tmux oder dvtm über Bildschirm. Sie sind moderner und sauberer Ersatz.
Donnerstag,

Ja, "tmux" ist zweifellos viel besser als screen.
ColinM

Es folgt auch genauer der Unix-Konvention für nicht intuitive, abgekürzte Namen :)
user394

13

Wenn Sie eine besonders lange Befehlszeile in Bash bearbeiten müssen

^X^E (Ctrl-X Ctrl-E) 

öffnet es im Editor ($ EDITOR).

In zsh können Sie dasselbe Verhalten erzielen, indem Sie Folgendes zu .zshrc hinzufügen:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 

Wow, das geht in das Buch.
l0b0

Ja, und in meine Notizen!
Jyz

12

Wenn Sie ein schneller Schreibkraft sind, sind diese nützlich:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'

Mit diesem Makro können Sie die Gesamtsummen einer Ausgabespalte berechnen: Dateigrößen, Bytes, Pakete. Sie müssen lediglich die Spalte angeben, die Sie hinzufügen möchten:

total ()
{
        if [ x$1 = x ]; then set `echo 1`; fi
        awk "{total += \$$1} END {print total}"
}

Wenn Sie es zum Beispiel so verwenden, ohne Argumente, addiert es die Summe der ersten Spalte:

du | total

Wenn Sie das Argument angeben, wird diese Spalte summiert. Dies gibt beispielsweise die Gesamtzahl der Bytes an, die von allen C # -Dateien in / tmp verwendet werden:

ls -l /tmp/*cs | total 5

Manchmal kommt es vor, dass Ihre Konsole nicht mehr funktioniert, weil Sie versehentlich eine Binärdatei angezeigt haben (z. B. cat / bin / ls). Sie können das Terminal mit der folgenden Shell-Funktion wiederherstellen:

restaura ()
{
    perl -e 'print "\e)B";'
}

Ich mag es, wenn mein l Zeichen verwendet, um die Dateiklasse zu unterscheiden und die von meinem Editor generierten Sicherungsdateien auszublenden (Sicherungsdateien enden mit dem Zeichen ~):

alias ls='ls -FB'

Vergiss nicht: alias gerp = 'grep --color = tty' Ich mache das die ganze Zeit ;-)
Robert Swisher

1
Für mich zählt "schnell" nicht, wenn ich nicht genau bin. Sie können sich auch die Variablen GREP_COLORS und GREP_OPTIONS ansehen.
Andy Lester

2
s/fast/sloppy/
Josh

1
Ich benutze, resetwo Sie verwenden restaura.
10.

11
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.

Einer meiner Favoriten, wenn ich vergesse s:

$ s !! # last command with super user priviledges

2
Wenn Sie ZSH verwenden, können Sie bindkey -s '\e[12~' "sudo !!\n"(in diesem Fall) F2 binden, um diesen Befehl auszuführen. Ich habe diese Bindung, also wenn ich etwas starte und die Fehlermeldung "Sie haben 'sudo', Idiot 'vergessen" sehe, kann ich nur verärgert auf F2 stechen
Michael Mrozek

Schlechte F2-Taste ...)
Eimantas

Ich benutze das die ganze Zeit. Ich vergesse ständig, sudo einzugeben, bevor ich meine hosts-Datei bearbeite. In diesem Fall starte ich einfach sudo !! +1
Brian Wigginton

10

Wenn ein Befehl stdin eingibt, können Sie die Eingabe aus einer Datei mit lesen <filename. Dies kann an einer beliebigen Stelle im Befehl erscheinen, daher sind diese Zeilen gleichbedeutend:

cat filename
cat <filename
<filename cat

Dies ist besonders nützlich für grep, da Sie den Ausdruck am Ende der Zeile platzieren können, sodass Sie einen grep-Befehl durch Drücken schnell ändern können Up, ohne nach links scrollen zu müssen, um den Dateinamen zu überschreiten:

<filename grep 'expression'

3
Ein guter Tipp! Erwähnenswert ist, dass dadurch die Argumente für den Befehl nicht neu angeordnet werden. Stattdessen leitet es die Datei in den Prozess 'STDIN' weiter, da grep jetzt kein Dateiargument mehr hat und standardmäßig aus STDIN liest. Wenn Sie dies verstehen, haben Sie viele Möglichkeiten, diese Technik mit anderen Befehlen zu kombinieren und zu verstehen, was passiert, wenn die Dinge nicht wie erwartet funktionieren. Weitere Informationen finden Sie unter Pipes und Redirectors: dsj.net/compedge/shellbasics1.html
chillitom

@chill Gute Punkte; Das Trinkgeld war tatsächlich so schlecht formuliert, dass es im Wesentlichen falsch war. Ich habe es basierend auf Ihrem Kommentar umgeschrieben
Michael Mrozek

Etwas, was ich kürzlich herausgefunden habe: Sie können Eingaben in Schleifen umleiten (für, während usw.). Siehe faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones

Normalerweise setzen Sie die Umleitung auf das Ende. Während die Pipeline-Metapher mit besser aussieht <input foo | bar | baz >output, funktioniert es nicht, wenn Sie versuchen, einige Shell-Loop-Primitive wie whileoder forin der Mitte zu mischen . Also habe ich aufgegeben und es am Ende laut Konvention hingestellt.
10.

@jmtd Nun, wenn Sie es am Ende setzen, entfällt "Dies ist besonders nützlich für grep, da Sie damit den Ausdruck am Ende der Zeile platzieren können, so dass Sie einen grep-Befehl schnell ändern können, indem Sie auf Up drücken, ohne einen Bildlauf durchführen zu müssen links, um den Dateinamen zu überschreiten "
Michael Mrozek

9

Mit können Sie CDPATHdas Verzeichnis einrichten, das dem entspricht PATH. Wenn Sie es versuchen cd foound fooim aktuellen Verzeichnis kein Verzeichnis vorhanden ist, prüft die Shell jedes der Verzeichnisse, nach denen sie CDPATHsucht foo, und wechselt zu dem ersten Verzeichnis, das sie findet:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise

3
Dies kann zu Problemen führen. Siehe softpanorama.org/Scripting/Shellorama/cdpath.shtml "Wenn $ CDPATH festgelegt ist, hängt die eingebaute CD das aktuelle Verzeichnis nicht implizit an. Dies bedeutet, dass die CD fehlschlägt, wenn kein gültiger Verzeichnisname erstellt werden kann der Einträge in $ CDPATH, auch wenn ein Verzeichnis mit demselben Namen wie der als Argument für cd angegebene Name im aktuellen Verzeichnis vorhanden ist. " Ich bin davon gebissen worden, einige Makefiles haben aufgehört zu arbeiten. Anhängen. Es könnte zwar explizit helfen, aber es gibt auch einige Probleme damit.
19.

9
vi `which scriptname`

Denn wenn Sie nicht wissen, wo etwas lebt, und es Ihnen auch nichts ausmacht.


8
Ich habe nicht vor, ZSH-Funktionen weiterhin einzuschalten, denke aber immer wieder daran, wie andere antworten :). In ZSH können Sie = foo ausführen, um whichautomatisch aufzurufen , alsovi =scriptname
Michael Mrozek

Wenn Sie Probleme haben, den Backtick-Charakter nachzuschlagen, können Sie auch$(scriptname)
Patrick

9

Das kaufmännische Und . Der Befehl wird in den Hintergrund gestellt, sodass Sie mit der Eingabe fortfahren können.

$> sudo updatedb &

Arbeiten Sie mit und nach einer Weile sehen Sie:

[1] 17403

Und Ihr Prozess ist fertig! Großartig für Dinge, bei denen Sie nicht darauf warten müssen, dass sie beendet werden.


11
Und wenn Ihre App eine grafische Benutzeroberfläche ist, möchten Sie wahrscheinlich nicht, dass sie in Jobs bleibt. Hängen Sie &!den Job an den Hintergrund an und schließen Sie ihn aus der Shell aus!
unperson325680

@progo: Das funktioniert bei mir nicht bash.
Nathan Osman

@George. Es scheint, dass Sie recht haben. Ich habe erfahren, dass zsh es unterstützt, und später habe ich gehört, dass bash es auch unterstützt. Oh my :(
unperson325680

1
@progo: Es stellt sich heraus, dass dies durch das Voranstellen des Befehls nohuperreicht wird.
Nathan Osman

8

Tab Vervollständigung . Wie schlimm wäre es, wenn Sie alle Zeichen jedes Pfades eingeben müssten?


5
Es gibt Selbstmord-Linux. Wenn Sie den Befehl falsch eingeben, ist dies der Fall rm -fr /. Also ja, Tab-Vervollständigung ist ziemlich wichtig ...
Eimantas

Nicht so schlimm, wie Sie vielleicht denken (aber immer noch schlimm), Sie streuen einfach überall Platzhalter ein:ls /usr/lib/game-d*/rott*
jmtd

@Eimantas Wird rm -rf /in den meisten Linux-Systemen nicht deaktiviert?
Bernhard Heijstek

@phycker - Ich habe Suicide Linux erwähnt, nicht "alle".
Eimantas

7

Umount last mounted device:

mount /media/whatever
...
u!mo

!mowird auf den letzten Befehl erweitert, mit dem begonnen wurde mo(zumindest in Bash). Manchmal tut man das mvin der Mitte, deshalb u!mfunktioniert es nicht so oft.


Verwenden Sie Strg + Umschalt + 6 (Strg + ^), um den Befehl zu erweitern, ohne ihn aus Sicherheitsgründen
auszuführen

7

Ich habe dies in meinem .bashrc

#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'

 

function find-all() {
    python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
    if type(i) == type(''):
        print i
    else:
        print i[0]"
}

Und wenn ich HTML-Quellcode in der Zwischenablage habe und alle Links finden möchte, die ich verwende

c-v | find-all 'href="([^"]*)"' | c-c

Und ich habe alle URLs in der Zwischenablage

Ich habe auch diese Funktion

function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}

welche Anzeigegröße (von Menschen lesbar) und Dateiname.

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'

Dieser Alias ​​ist für die Show-Temperatur

function separate() {
    python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}

Mit dieser Funktion kann ich das Produkt oder die Summe der Argumente berechnen.

alias sum='separate + | bc'
alias product='separate * | bc'

function split-join() {
    python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}

Dies ist eine nützliche Funktion, die die Standardeingabe durch Regex getrennt aufteilt und dann das Ergebnis zusammenfügt.

function factorial() {
    seq -s* $1 | bc
}

Fakultätsfunktion

function wiki() { dig +short txt $1.wp.dg.cx; }

Diese Funktion zeigt Wiki-Text über DNS an

Ich habe auch drei Farbfunktionen

function blue() {
    echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}

function green() {
    echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}

function red() {
    echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}

 

function md5check() {
    test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}

Diese Funktion validiert die Datei md5 hash.

Dies zeigt eine Fehlermeldung für einen bestimmten Code an

function strerror() { python -c "import os; print os.strerror($1)"; }

Sie können alle Nachrichten mit ausdrucken

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'

6

Ein weiterer nützlicher ZSH-Trick:

Behandle die Ausgabe eines Befehls als Datei:

emacs =(hg cat -r 100 somefile)

Dadurch wird eine alte Version einer Mercurial-Datei in Emacs zur syntaktisch hervorgehobenen Anzeige geöffnet. Ohne das würde ich zu verwirren haben um mit hg revert, hg archiveoder explizit senden hg catAusgabe in eine temporäre Datei.

Dies funktioniert natürlich mit jedem Programm, das Dateien öffnet, und mit jedem Programm, das auf Standardausgabe druckt.


5
Sie können dies in bash mit dem <()
ScaryAardvark

5

Eine ZSH-spezifische Funktion sind Suffix-Aliase, die durch Angabe aliasdes -sFlags festgelegt werden:

alias -s ext=program

Wenn eine bestimmte Erweiterung einen Suffix-Alias ​​hat, können Sie eine Datei mit dieser Erweiterung direkt ausführen, und ZSH startet das angegebene Programm und übergibt den Dateinamen als Argument. Wenn der obige Alias ​​aktiviert ist, sind diese Zeilen äquivalent:

/path/to/foo.ext
program /path/to/foo.ext

Dies ist eine Sache, die ich an Windows sehr vermisst habe ... bis mir klar wurde, dass "program" immer Emacs war, also habe ich aufgehört, Shell zum Öffnen von Dateien zu verwenden und habe einfach Cx Cf (duh) verwendet.
Harpo

5

Eine meiner beliebtesten ZSH-Funktionen ist die Verwendung von Verzeichnissen. Sie können eine Variable mit einem bestimmten Namen und einem Wert exportieren, der auf einen bestimmten Pfad verweist:

export foo=/usr/bin

Jetzt können Sie ~fooin einem Befehl auf Folgendes verweisen /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename

Wenn Ihre Eingabeaufforderung das aktuelle Arbeitsverzeichnis anzeigt, werden die Namen der Variablen dort auch verwendet, soweit ich mich erinnere.
Andre Holzner

4

Siehe diese Frage .

Wenn du rennst ps ax | grep string:

[steve@sage-arch ~]$ ps ax | grep 'openbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 5100 pts/0    S+     0:00 grep openbox

Die letzte Zeile grepist etwas nervig

Sie können sich davon befreien, indem Sie Folgendes ausführen ps ax | grep '[s]tring':

[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session

update : oder einfach ausführenpgrep string


Ja, sehr nützlich. Du solltest aber openbox ( '[o]penbox') zitieren . Die Klammern funktionieren wie ein Globus. Wenn sich also Openbox in Ihrem Verzeichnis befindet (sagen wir, Sie sind in diesem Verzeichnis /usr/bin), verwendet bash nur Openbox, wodurch der Grep-Trick verhindert wird.
Rich Homolka

4
  • Der Do-Nothing-Befehl :wie in

    while :; do :; done
  • Klammererweiterung in Kombination mit for-Schleifen:

    for c in {1..3}; do :; done
  • !Betreiber und Kurzschlussbetreiber ||und&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • Verwenden von Subshells anstelle von Pop / Push (nützlich in Skripten)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • die Art von was ist Befehltype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • auch sehr schön: hier-saiten

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • und mein Favorit: Umleitung auf eine Befehlsliste

    { w; ps; ls /tmp; } 2>/dev/null |less

3

Ich liebe es, so viel Zeug wie möglich in meine PS1 zu schmeißen. Einige nützliche Dinge, an die Sie sich erinnern sollten:

\e[sund \e[uspeichern bzw. nicht speichern Sie die Cursorposition. Ich benutze dies, um eine 'Info-Leiste' am oberen Bildschirmrand zu erstellen, die ein paar Zeilen lang ist und mehr Platz bietet. Beispiel:

PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t        \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]\$ '

Kombinieren Sie mit alias clear='echo -e "\e[2J\n"'. Versuch es!

Außerdem PROMPT_COMMANDdefiniert die Variable einen Befehl, der jedes Mal vor der PS1 ausgeführt wird.

Ein anderer ist der bgBefehl. Wenn Sie vergessen , setzen &am Ende eines Befehls, drücken Sie einfach ^Zund Art bg, und es läuft im Hintergrund.


danke für das bg, wenn ich ein programm im hintergrund laufen habe und versehentlich drücke fgich weiß nicht wie ich es zurückschieben soll: D
phunehehe

Ich mag eine saubere, PS1so dass ich die meisten Dinge, die ich will, in mein Bildschirm-Fazit setzen ...
Josh
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.