Jakie są twoje ulubione funkcje lub sztuczki z wiersza poleceń?

94

Udostępnij funkcje i sztuczki wiersza poleceń dla systemu Unix / Linux. Staraj się utrzymywać to shell / distro agnostic, jeśli to możliwe. Zainteresowany widzeniem aliasów, liniałów, skrótów klawiaturowych, małych skryptów powłoki itp.

Casey
źródło

Odpowiedzi:

89

Rozszerza to nieco !!sztuczkę wspomnianą w tej odpowiedzi . W rzeczywistości istnieje wiele poleceń związanych z historią, o których często się zapomina (ludzie mają tendencję do dźgania Up100 razy zamiast szukania polecenia, o którym wiedzą, że je wpisali).

  • historyKomenda pokaże listę ostatnio uruchamianych poleceń z desygnatora zdarzeń w lewo
  • !N zastąpi polecenie związane z desygnatorem zdarzenia N
  • !-Nbędzie zastąpić N th ostatnią komendę; np. !-1zastąpi ostatnie polecenie, !-2drugie ostatnie itd.
  • Jak wspomniano w drugiej odpowiedzi, !!jest skrótem !-1, aby szybko zastąpić ostatnie polecenie
  • !string zastąpi ostatnie polecenie, które zaczyna się od string
  • !?string? zastąpi najnowsze polecenie, które zawiera string

Oznaczenia słów można dodać do !polecenia historii, aby zmodyfikować wyniki. Dwukropek oddziela oznaczenia zdarzenia i słowa, np !!:0. Oznaczenie zdarzenia !!można skrócić do samego !oznaczenia słowa, więc !!:0jest to równoważne z !:0.

  • !:0 dostanie polecenie, które zostało wykonane
  • !:1dostanie pierwszy argument (i !:2drugi itd.)
  • !:2-3 dostanie drugi i trzeci argument
  • !:^to kolejny sposób na uzyskanie pierwszego argumentu. !:$dostanie ostatni
  • !:*otrzyma wszystkie argumenty (ale nie polecenie)

Modyfikatory można również dołączyć do !polecenia historii, każdy poprzedzony dwukropkiem. Dowolną liczbę można układać (np !:t:r:p.).

  • h - Wyrównaj do podstawowej nazwy pliku
  • t - Tylko podstawowa nazwa pliku
  • r - Ustaw zgodnie z rozszerzeniem nazwy pliku
  • e - Tylko rozszerzenie nazwy pliku
  • s/search/replacement- Wymienić pierwsze wystąpienie searchzreplacement
  • gs/search/replacement- zastąpić wszystkie wystąpienia searchzreplacement
Michał Mrożek
źródło
3
A jeśli używasz Bash (może być taki sam dla niektórych innych powłok), M- ^ (Meta ^) rozszerza dla ciebie powyższe operatory ekspansji historii, na wypadek, gdybyś chciał zobaczyć, co tak naprawdę polecasz do.
Eric Smith
1
Nigdy nie znalazłem zastosowania do! dowodzić rzeczami. Wydaje mi się po prostu źle wykonać polecenie, którego nie widzę. Tak łatwo byłoby wpisać! -3 zamiast! -4 i kto wie, co może się zdarzyć. Znalezienie numeru wiersza polecenia, które chcę uruchomić, jest zwykle bardziej bolesne niż warte. Fajne sztuczki, ale nigdy nie znalazłem dla nich prawdziwego zastosowania.
Falmarri,
1
@Falmarri Też nigdy nie używam !-#. Używam !stringdo uruchomienia ostatniego polecenia, które zaczyna się od łańcucha, ale generalnie najpierw kompletuję je tabulatorem (zsh), aby upewnić się, że działam poprawnie
Michael Mrozek
1
Nie! :) „Uruchomienie !Nuruchomi polecenie ...” jest zbyt wąskim opisem; faktycznie !Nzostanie zastąpione poleceniem ...; i tak dalej dla wszystkich opisów w odpowiedzi. Więcej poprawnych i otwierających o wiele bardziej użytecznych możliwości! Np sudo !!. Wspomniane .
imz - Ivan Zakharyaschev
1
Aby uruchomić poprzednie polecenia wyszukiwane przez ciąg, zwykle po prostu naciskam Ctrl-R. Wiele klawiszy Ctrl-R zagłębi się w historię. W ten sposób natychmiast widzę znalezione polecenie i mogę je odrzucić i szukać dalej. Ctrl-G ucieka z tego trybu. Jedyną niedogodnością jest to, że Ctrl-R jest dla bash; w Emacs, aby przeglądać historię poleceń wejściowych i wartości (dla Mx lub innych odczytanych wartości), zamiast tego używa się Meta-R (Meta-R jest również używany eshellw Emacs). Więc często je psuję.
imz - Ivan Zachharyaschev
65

bash - wstaw ostatni parametr poprzedniego wiersza

alt- . najbardziej użyteczna kombinacja klawiszy w historii, spróbuj i przekonaj się, z jakiegoś powodu nikt o niej nie wie.

naciśnij kilkakrotnie, aby wybrać starsze ostatnie parametry.

świetnie, gdy chcesz zrobić coś więcej z argumentem / plikiem, którego użyłeś przed chwilą.

chillitom
źródło
11
Możesz także użyć! $, Aby odwołać się do ostatniego argumentu w poprzednim poleceniu. Jest to przydatne, ponieważ działa zarówno w skryptach, jak i interaktywnie. (Działa w bash i zsh)
4
Za każdym razem, gdy klikniesz alt- .przejdzie do poprzedniego polecenia i wyciągnie z niego ostatni argument. Więc jeśli chcesz ostatni argument z trzech poleceń temu, po prostu naciśnij alt- .trzy razy.
clee,
2
Jest to domyślne powiązanie klawisza dla yank-last-argpolecenia readline, więc powinno działać z każdym programem powiązanym z readline, nie tylko BASH lub ZSH.
James Sneeringer,
W trybie vi musiałem ponownie powiązać yank-last-arg zgodnie z następującą odpowiedzią: superuser.com/questions/18498/…
Jeromy Anglim
W xterm meta-. produkuje ®, ale możesz użyć esc zamiast meta (ogólnie w bash), więc esc-. zamiast.
derobert
49

Moim ulubionym jest

man 7 ascii

Prosty i bardzo przydatny.

   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

Zajrzyj na tę stronę Commandlinefu.com .

Możesz również zapoznać się z tymi czterema artykułami Peterisa Kruminsa na jego blogu

terdon
źródło
2
Przydatny jest także osobny ascii program . Oprócz wydrukowania tabeli umożliwia ona zapytanie o jeden lub więcej pojedynczych znaków.
Matthew Flaschen
46

Wykonaj ostatnie polecenie jako root:

sudo !!
Alex B.
źródło
42

Nie jestem pewien, czy liczy się to jako „sztuczka”, ale ludzie wydają się bardzo nieświadomi standardowych skrótów klawiszowych readline. Szczególnego zastosowania w muszlach:

  • Ctrl+ U- Wytnij bieżącą linię
  • Ctrl+ Y- Wklej linię cięcia za pomocą Ctrl+U
  • Ctrl+ L- Wyczyść ekran i przerysuj bieżącą linię
  • Ctrl+ G- Zdobądź nową linię i porzuć obecną
Michał Mrożek
źródło
5
Wystarczy dodać do nich kilka: Ctrl + A, aby przejść na początek linii, Ctrl + E, aby przejść na koniec linii, Ctrl-K, aby usunąć z kursora do końca linii.
rsuarez
Ctrl+Lodpowiada znakowi FormFeed ascii. Zazwyczaj przerysowuje ekran w aplikacjach tekstowych z oknem ekranowym (np. Vim, less, mc itp.). Fajnie, jeśli ekran został „zanieczyszczony” przez dane wyjściowe z innego programu.
hlovdal
Dodanie do listy skrótów klawiszowych: Ctrl+Wwycinanie jednego słowa do tyłu, przewijanie Alt+Fdo przodu o jedno słowo, przewijanie Alt+Bdo tyłu o jedno słowo w linii. Lubię Ctrl+Yi Shift+Insertponieważ możesz mieć dwie skopiowane linie. Jeden za pomocą Ctrl+U(wklej go za pomocą Ctrl+Y) i jednocześnie możesz skopiować inne słowo (wybierz linię) wklej za pomocą ( Shift+Insert).
36

CTRL+ Rw BASH do wyszukiwania / aktywacji wcześniej wykonanych poleceń (zawartość ~ / .bash_history).

Jest to często bardzo pomocne. Uruchomienie tego aliasu będzie obsługiwać PWD przez HTTP (indeksowane) na porcie 8000:

alias webserver="python -m SimpleHTTPServer"

A ponieważ cały czas biegam, piszę i piszę zbyt szybko, te aliasy są prawdopodobnie najczęściej używane (poważnie):

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

I prawdopodobnie moim najczęściej używanym fragmentem BASH jest prosty skrypt, który nazywam uploadem. Używam go do blitowania wszelkiego rodzaju treści do mojej Linode, i kopiuje wynikowy adres URL HTTP do mojego schowka (środkowe kliknięcie). Bardzo przydatne do wklejania rzeczy do ludzi w IRC:

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

Tylko para. Mogę pisać o wiele później, muszę wrócić do pracy!

Aaron Bockover
źródło
8
alias mk=makeSzybsze pisanie i mniejsze prawdopodobieństwo popełnienia błędu. Lub skompiluj z edytora za pomocą skrótu ...
Lars Haugseth,
BTW Zsh ma wbudowaną korektę pisowni, która jest bardzo dobra w korygowaniu prostych literówek.
Adam Byrtek,
Również w Zsh myślę, że domyślnie jest to, że kiedy naciskasz klawisz w górę, to przeszukuje historię tak, jakbyś nacisnął ctrl r. Może nie być domyślny, ale jest to ustawienie.
Falmarri
Pomyślę alias m=make, lub nawet m=make -j6lub podobny - z wyjątkiem używam już alias m=mutt
jmtd
31

diff wyjście dwóch poleceń bez ręcznego tworzenia pliku tymczasowego (bash):

diff <(ls dir1) <(ls dir2)
Alex B.
źródło
Jest to również bardzo przydatne, commponieważ zajmuje tylko pliki, ale w wielu przypadkach jest to marnotrawstwo i-węzłów.
Marcin
30

Całkiem proste, ale wydaje się, że ludzie nie wiedzą, wraca do poprzedniego katalogu:

cd -
Robert Swisher
źródło
Mówię wam, cd..od DOS jest zakorzenione w mojej pamięci mięśni ...
LawrenceC
Jest to tania wersja pushd i popd ...
Robert Massaioli
Podobnie jest cd(bez argumentów), który zabierze Cię do twojego katalogu domowego.
Mei
Tak, to szalone. Gdzie na stronie podręcznika pokazuje rozszerzenie „-”? Zawsze próbuję (i zapominam) używać pushd / popd
Chuck R
29

Rozszerzenie klamry :

Rozwijanie nawiasów to mechanizm, za pomocą którego można generować dowolne ciągi.

Pozwala zastąpić żmudne linie, takie jak:

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

z krótszą instancją

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

niektóre inne zastosowania

# 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 

Rozbudowa arytmetyczna :

Rozwinięcie arytmetyczne pozwala na ocenę wyrażenia arytmetycznego i podstawienie wyniku. Format interpretacji arytmetycznej jest następujący:

$((expression))

Wyrażenie jest traktowane tak, jakby znajdowało się w podwójnych cudzysłowach, ale podwójne cudzysłowy w nawiasach nie są traktowane specjalnie. Wszystkie tokeny w wyrażeniu podlegają interpretacji parametrów, interpretacji ciągów, zastępowaniu poleceń i usuwaniu cytatów. Rozszerzenia arytmetyczne mogą być zagnieżdżone.

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
Stefan
źródło
3
Fajnie, nie mogę uwierzyć, że o tym zapomniałem. Istnieje również bardziej kompaktowy, foo[123]który się rozszerzy foo1 foo2 foo3, ale w tym przypadku muszą być nazwami plików
Michael Mrozek
hehe .. dzięki ... ucz się czegoś codziennie +1
Stefan
29

Zazwyczaj jest to w moim skrypcie startowym (.bashrc, .profile, cokolwiek)

shopt Boże, sprawdź komentarze:

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

Alias, który zapisuje naciśnięcia klawiszy: mkdiri cddo niego:

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

I na koniec zrezygnowałem z zapamiętywania składni tar, więc:

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
}
sygo
źródło
5
+1, dlaczego o tym nie pomyślałem? (wyciąg)
MAK
Mam podobną funkcję do mkcdtej, którą nazywam id md. Jednak użycie „$ @” jako argumentu dla cd nie ma żadnego sensu, ponieważ nie można cd do więcej niż jednego katalogu. „$ @” będzie działać dla mkdir, ale wtedy inaczej md () { mkdir -p "$1"; cd "$1" }
traktujesz
jak dodać te polecenia? po prostu wkleić jak .bashrc lub dodać „alias” przed nimi?
Asaf,
22

Dwie funkcje bash, które oszczędzają mi wielu naciśnięć klawiszy.

Wykonuj automatycznie ls po każdym udanym cd:

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

Idź w górę o poziomy:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}
Maik
źródło
4
Nigdy nie zdawałem sobie sprawy, że można zrobić builtin fooobejście, mając zdefiniowaną funkcję cd; Korzystałem chdirz moich funkcji. Przydatny
Michael Mrozek
Niesamowite. Wystarczy dodać -F do ls w funkcji cd i jest to idealne (dla mnie)!
frabjous
2
Robię to samo co ty dla cd, ale mam jeszcze kilka kontroli poczytalności i cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
unikam
17

Ponieważ zwykle jestem w połowie drogi do wiersza poleceń, zanim chcę wyszukiwać (CTRL-R w bash), mam następujące .bashrc

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

Oznacza to, że jeśli wpisuję cd, a następnie naciskam góra / dół, widzę wszystkie opcje, które mam cd. Zasadniczo używam tego do często używanych katalogów. Jak „cd w” i kończę przeglądanie wszystkich obszarów roboczych, z których często korzystam.

żebrak
źródło
Ten jest naprawdę świetny! Rozszerza zachowanie strzałek bez naruszania ich podstawowej funkcjonalności. Dzięki!
philfr
17

Jedną z rzeczy, która oszczędza mi dużo czasu, są polecenia pushd / popd. Ci faceci pozwalają ci stworzyć stos katalogów i znacznie ograniczyć pisanie:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
jacksonh
źródło
2
Tak! alias u = pushd; alias o = popd
cannedprimates
2
.. i co ui ooznaczają tutaj?
deizel
@deizel: Nic konkretnego, tylko skrót, aby uniknąć pisania.
Adam Byrtek,
2
Wygląda jak druga litera polecenia, ponieważ oba zaczynają się na p, nie można użyć tego dla obu.
camh
W ZSH możesz setopt autopushdi wszystkie zmiany katalogów będą się wypychać automatycznie
Michael Mrozek
14

screen Polecenia . Zasadniczo zapisuje sesję wiersza poleceń na wypadek powrotu. To rodzaj menedżera terminali, jak menedżer okien. W ten sposób w jednej sesji terminala możesz mieć wiele wirtualnych terminali. To jest bardzo fajne.

Jeśli się używa screen, ta funkcja powłoki (włóż ją .bashrc) jest niezwykle przydatna:

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

po wpisaniu scrsprawdzi, czy twoja sesja główna istnieje i dołączy do niej. W przeciwnym razie go utworzy.

Sebastian
źródło
technicznie jest to własny program, a nie „polecenie”.
unperson325680
1
Polecam tmux lub dvtm na ekranie. Są bardziej nowoczesne i czystsze zamienniki.
deltaray
Tak, „tmux” jest zdecydowanie lepszy niż ekran.
ColinM
Ściśle przestrzega też konwencji uniksowych, nieintuicyjnych, skróconych nazw :)
user394,
13

Jeśli potrzebujesz edytować szczególnie długą linię poleceń w bash

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

otworzy go w edytorze ($ EDITOR).

W zsh możesz uzyskać takie samo zachowanie, dodając to do .zshrc:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 
zredagowane
źródło
Wow, ten idzie do Księgi.
l0b0
Tak, i do moich notatek!
jyz
12

Jeśli jesteś szybkim maszynistą, przydadzą się:

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

To makro pomaga obliczyć sumy kolumny danych wyjściowych: rozmiary plików, bajty, pakiety, wszystko co musisz zrobić, to określić kolumnę, którą chcesz dodać:

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

Używasz go w ten sposób, na przykład, bez argumentów, dodaje sumę pierwszej kolumny:

du | total

Jeśli podasz argument, suma ta kolumna, na przykład, daje całkowitą liczbę bajtów używanych przez wszystkie pliki C # w / tmp:

ls -l /tmp/*cs | total 5

Czasami twoja konsola się popsuła, ponieważ przypadkowo obejrzałeś plik binarny (na przykład cat / bin / ls), możesz przywrócić terminal za pomocą tej funkcji powłoki:

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

Lubię, aby moje znaki używały znaków do rozróżniania klasy plików, a także do ukrywania plików kopii zapasowych generowanych przez mój edytor (pliki kopii kończą się znakiem ~):

alias ls='ls -FB'
miguel.de.icaza
źródło
Nie zapomnij: alias gerp = 'grep --color = tty' Robię to cały czas ;-)
Robert Swisher
1
Moim zdaniem „szybkie” nie ma znaczenia, jeśli nie jestem dokładny. Możesz także przyjrzeć się zmiennym GREP_COLORS i GREP_OPTIONS.
Andy Lester,
2
s/fast/sloppy/
Josh
1
Używam resettam, gdzie używasz restaura.
jmtd
11
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.

Jeden z moich ulubionych, gdy zapomnę s:

$ s !! # last command with super user priviledges
Eimantas
źródło
2
Jeśli używasz ZSH, możesz zrobić coś takiego jak bindkey -s '\e[12~' "sudo !!\n"powiązanie (w tym przypadku) F2, aby uruchomić to polecenie. Mam to powiązanie, więc kiedy coś uruchomię i zobaczę komunikat o błędzie „zapomniałeś sudo”, głupcze ”, mogę po prostu dźgnąć F2 z irytacją
Michael Mrozek
Słaby klawisz F2 ...)
Eimantas,
Używam tego cały czas. Ciągle zapominam pisać sudo przed edycją pliku hosts. Jeśli tak się stanie, po prostu uruchomię sudo !!. +1
Brian Wigginton
10

Jeśli polecenie pobiera standardowe wejście, możesz je odczytać z pliku za pomocą <filename. Może pojawić się w dowolnym miejscu polecenia, więc te linie są równoważne:

cat filename
cat <filename
<filename cat

Jest to szczególnie przydatne w przypadku grep, ponieważ pozwala umieścić wyrażenie na końcu wiersza, dzięki czemu można szybko zmodyfikować polecenie grep, naciskając go Up, bez potrzeby przewijania w lewo, aby ominąć nazwę pliku:

<filename grep 'expression'
Michał Mrożek
źródło
3
Dobra wskazówka! Warto zauważyć, że tak naprawdę nie zmienia to kolejności argumentów polecenia. Zamiast tego przesyła plik do procesu STDIN, ponieważ grep nie ma teraz argumentu pliku, domyślnie odczytuje ze STDIN. Zrozumienie tego otworzy wiele możliwości użycia tej techniki z innymi poleceniami, a także pomoże ludziom zrozumieć, co się dzieje, gdy rzeczy nie działają zgodnie z oczekiwaniami. Aby uzyskać więcej informacji, wyszukaj potoki i przekierowania: dsj.net/compedge/shellbasics1.html
chillitom
@chill Dobre punkty; końcówka była tak źle sformułowana, że ​​była w zasadzie błędna. Przepisałem go na podstawie twojego komentarza
Michael Mrozek
Coś, co ostatnio odkryłem: możesz przekierowywać dane wejściowe do pętli (for, while itp.). Zobacz faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones
Konwencjonalnie przekierowujesz na koniec. Chociaż metafora potoku wygląda lepiej <input foo | bar | baz >output, nie działa, jeśli spróbujesz wmieszać się w niektóre prymitywy zapętlające powłoki, takie jak whilelub forw środku. Więc poddałem się i po prostu położyłem to na końcu zgodnie z konwencją.
jmtd
@ jmtd Cóż, umieszczenie go na końcu eliminuje „Jest to szczególnie przydatne w przypadku grep, ponieważ pozwala umieścić wyrażenie na końcu wiersza, dzięki czemu można szybko zmodyfikować polecenie grep, naciskając klawisz w górę, bez potrzeby przewijania pozostało, aby ominąć nazwę pliku ”
Michał Mrożek
9

Możesz użyć, CDPATHaby skonfigurować katalog równoważny z PATH; jeśli spróbujesz cd fooi nie ma go foow bieżącym katalogu, powłoka sprawdzi każdy katalog, który go CDPATHszuka foo, i przełączy się do pierwszego, który znajdzie:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
Michał Mrożek
źródło
3
Może to powodować problemy. Zobacz softpanorama.org/Scripting/Shellorama/cdpath.shtml "Jeśli ustawiono $ CDPATH, wbudowany cd nie będzie domyślnie dołączał do niego bieżącego katalogu. Oznacza to, że cd nie powiedzie się, jeśli nie można skonstruować poprawnej nazwy katalogu wpisów w $ CDPATH, nawet jeśli katalog o takiej samej nazwie jak nazwa podana jako argument do cd istnieje w bieżącym katalogu. " Ugryzło mnie to, niektóre Makefile przestały działać. Dołączanie wyraźnie może jednak pomóc, ale są też pewne problemy.
ustun
9
vi `which scriptname`

Bo kiedy nie wiesz, gdzie coś mieszka, i ciebie też to nie obchodzi.

Matt Simmons
źródło
8
Nie mam zamiaru nadal podłączać funkcji ZSH, ale myślę o nich, gdy inni odpowiadają :). W ZSH możesz zrobić = foo, aby wywoływać whichautomatycznie, więcvi =scriptname
Michael Mrozek
Jeśli masz problem ze znalezieniem postaci, której możesz użyć, możesz także użyć$(scriptname)
Patrick
9

Znak handlowe i . Umieszcza twoje polecenie w tle, dzięki czemu możesz kontynuować pisanie.

$> sudo updatedb &

Pracując dalej, a po chwili zobaczysz:

[1] 17403

I twój proces jest zakończony! Idealne do rzeczy, w których nie trzeba czekać na zakończenie.

użytkownik394
źródło
11
A jeśli twoją aplikacją jest GUI, prawdopodobnie nie chcesz, aby utrzymywała się w zadaniach. Dołącz &!do zadania i usuń go z powłoki!
unperson325680
@progo: To mi nie działa bash.
Nathan Osman
@Jerzy. Wygląda na to, że masz rację. Dowiedziałem się, że zsh go obsługuje, a później usłyszałem, że bash go również obsługuje. O mój :(
unperson325680
1
@progo: Okazuje się, że wcześniejsze wykonanie polecenia powoduje nohupto.
Nathan Osman
8

Uzupełnianie tabulatorów . Jak źle by to było, gdybyś musiał wpisać wszystkie postacie z każdej ścieżki?

użytkownik394
źródło
5
Jest linux samobójczy. Jeśli wpiszesz niepoprawnie polecenie - tak rm -fr /. Więc tak, uzupełnianie Tab jest bardzo istotne ...
Eimantas
Nie tak źle, jak mogłoby się wydawać (ale nadal źle), po prostu ls /usr/lib/game-d*/rott*
posypuj
@Eimantas Nie jest rm -rf /wyłączone w większości systemów Linux?
Bernhard Heijstek,
@ phycker - wspomniałem o Suicide Linux, a nie o „wszystkich”.
Eimantas,
7

Umount ostatnio zamontowane urządzenie:

mount /media/whatever
...
u!mo

!morozwija się do ostatniego polecenia, które rozpoczęło się mo(przynajmniej w bash). Czasami robi się to mvw środku, więc u!mnie będzie tak często działać.

Roberto Bonvallet
źródło
Użyj Ctrl + Shift + 6 (Ctrl + ^), aby rozwinąć polecenie bez uruchamiania go ze względów bezpieczeństwa
ColinM
7

Mam to w moim .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]"
}

A kiedy mam kod źródłowy HTML w schowku i chcę znaleźć wszystkie linki, których używam

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

I mam wszystkie adresy URL w schowku

Mam również tę funkcję

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

który rozmiar wyświetlacza (czytelny dla człowieka) i nazwa pliku.

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

ten alias dotyczy temeratury programu

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

za pomocą tej funkcji mogę obliczyć iloczyn lub sumę argumentów.

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()))";
}

Jest to przydatna funkcja, która dzieli standardowe wejście oddzielone wyrażeniem regularnym, a następnie łączy wynik.

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

funkcja silnia

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

Ta funkcja wyświetla tekst wiki przez DNS

Mam również trzy funkcje kolorów

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]
}

Ta funkcja sprawdza poprawność pliku md5.

pokaże to komunikat o błędzie dla danego kodu

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

Możesz wydrukować wszystkie wiadomości za pomocą

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
jcubic
źródło
6

Kolejna przydatna sztuczka ZSH:

Traktuj wyjście polecenia jako plik:

emacs =(hg cat -r 100 somefile)

Spowoduje to otwarcie starej wersji pliku śledzonego przez Mercurial w emacsie do wyświetlania z wyróżnieniem składni. Bez tego, że będę musiał poeksperymentować z hg revert, hg archivelub bezpośrednio wysłać hg catwyjście do pliku tymczasowego.

Oczywiście działa to z każdym programem, który otwiera pliki i każdym programem, który drukuje na standardowe wyjście.

Matthew Flaschen
źródło
5
Możesz to zrobić w
skrócie
5

Cechą specyficzną jest ZSH aliasy sufiks, określone przez podanie aliasna -sflagę:

alias -s ext=program

Jeśli dane rozszerzenie ma alias sufiksu, możesz wykonać plik z tym rozszerzeniem bezpośrednio, a ZSH uruchomi dany program i przekaże nazwę pliku jako argument. Więc jeśli obowiązuje powyższy alias, te linie są równoważne:

/path/to/foo.ext
program /path/to/foo.ext
Michał Mrożek
źródło
Jest to jedna rzecz, której tak naprawdę brakowało mi w Windowsie ... dopóki nie zdałem sobie sprawy, że „program” zawsze był emacsem, więc przestałem używać powłoki do otwierania plików i po prostu użyłem Cx Cf (duh).
harpo
5

Jedną z moich ulubionych funkcji ZSH są katalogi. Możesz wyeksportować zmienną o podanej nazwie, której wartość wskazuje określoną ścieżkę:

export foo=/usr/bin

Teraz możesz użyć ~foow poleceniu odniesienia do /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename
Michał Mrożek
źródło
jeśli twój monit wyświetla bieżący katalog roboczy, nazwy zmiennych będą tam również używane, o ile pamiętam.
Andre Holzner,
4

Zobacz to pytanie .

Kiedy biegniesz 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

ostatnia linia zawierająca grepjest nieco denerwująca

Możesz się tego pozbyć, uruchamiając 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

aktualizacja : lub po prostu uruchompgrep string

Stefan
źródło
tak, bardzo przydatne. Powinieneś zacytować openbox chociaż ( '[o]penbox'). Nawiasy będą działać jak glob, więc jeśli w twoim katalogu znajduje się openbox (powiedz, że jesteś /usr/bin), bash po prostu użyje openbox, co zapobiegnie sztuczce grep.
Rich Homolka
4
  • Komenda „nic nie rób” :jak w

    while :; do :; done
  • Rozszerzenie nawiasu klamrowego w połączeniu z pętlą for:

    for c in {1..3}; do :; done
  • !operatorzy i operatorzy zwarć ||oraz&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • używanie podpowłok zamiast pop / push (przydaje się w skryptach)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • niby-of co-jest komendatype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • również bardzo ładne: tutaj-stringi

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • i moje ulubione: przekierowanie na listę poleceń

    { w; ps; ls /tmp; } 2>/dev/null |less
artistoex
źródło
3

Uwielbiam wrzucać jak najwięcej rzeczy do mojego PS1. Kilka przydatnych rzeczy do zapamiętania:

\e[si odpowiednio \e[uzapisz i cofnij pozycję kursora. Używam tego, aby u góry ekranu utworzyć „pasek informacyjny” o długości kilku linii, który może pomieścić więcej rzeczy. Przykład:

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\]\$ '

Połącz z alias clear='echo -e "\e[2J\n"'. Wypróbuj to!

Ponadto, PROMPT_COMMANDzmienna określa polecenie do wykonania przed PS1 za każdym razem.

Kolejnym jest bgpolecenie. Jeśli zapomnisz umieścić &na końcu polecenia, po prostu naciśnij ^Zi wpisz bg, a zostanie ono uruchomione w tle.

Lucas Jones
źródło
dzięki za bg, kiedy mam program działający w tle i przypadkowo naciśnij fgNie wiem, jak go odepchnąć: D
phunehehe
Lubię sprzątanie, PS1więc umieszczam większość rzeczy, które chcę w dolnej linii ekranu ...
Josh