Jaka jest Twoja najbardziej ulubiona sztuczka wiersza poleceń z użyciem Bash? [Zamknięte]

156

Wszyscy wiemy, jak używać <ctrl>-Rwyszukiwania wstecznego w historii, ale czy wiesz, że możesz użyć <ctrl>-Swyszukiwania do przodu, jeśli ustawisz stty stop ""? Ponadto, czy kiedykolwiek próbowałeś uruchomić bind -p, aby zobaczyć listę wszystkich swoich skrótów klawiaturowych? W systemie Mac OS X jest ich ponad 455.

Jaka jest Twoja najbardziej ulubiona niejasna sztuczka, skrót klawiaturowy lub konfiguracja sklepu za pomocą basha?

Robert Harvey
źródło
2
Proszę przeredagować to, aby powiedzieć „Jaki jest Twój ulubiony singiel”. Dzięki temu ludzie mogą głosować wyżej na określone odpowiedzi, prawie jak w ankiecie.
SCdF,
> Przeformułuj to tak, aby powiedzieć „Jaki jest Twój ulubiony singiel”. Gotowe.
Martin Klinke
1
Istnieje klon StackOverflow dla tego samego pytania: commandlinefu.com
rkb
Tylko 232 z tych 455 domyślnych skrótów klawiszowych robi coś innego niż "self-insert" ("wpisz ten klucz"): $ bind -p | grep -v self-insert | wc
Ed Brannin
Jest tu kilka fajnych rzeczy. Ale należy zauważyć, że sporo z nich działa tylko wtedy, gdy bash jest w trybie emacs ...
pon.

Odpowiedzi:

157

Szybka zmiana nazwy / przenoszenie plików z przyrostkami:
cp /home/foo/realllylongname.cpp{,-old}

To rozszerza się do:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

user10765
źródło
12
Niesamowite! Teraz muszę spróbować zapamiętać ten.
Jon Ericson,
9
Wystarczy zaznaczyć, że aby wykonać odwrotną
czynność
Tak oczywiste z perspektywy czasu, a mimo to nie sądzę, abym pamiętał, żebym zrobił to sam. Dzięki!
Zecc
150
cd -

Jest to odpowiednik przycisku Wstecz w linii poleceń (przenosi Cię do poprzedniego katalogu, w którym byłeś).

Mark Biek
źródło
6
Wolę samodzielnie używać pushdi popdutrzymywać stos katalogów.
Alex M
21
Ale 'cd -' ma tę zaletę, że działa, nawet jeśli nie pamiętałeś o użyciu pushd.
Sergio Acosta,
10
Warto wspomnieć, że „cd” przenosi do katalogu domowego.
dr-jan
Ciekawe, że to nie pojawia się w man cdlub cd --help(przynajmniej moim).
Halil Özgür
135

Kolejny ulubiony:

!!

Powtarza twoje ostatnie polecenie. Najbardziej przydatne w postaci:

sudo !!
amrox
źródło
81
ma tę dodatkową zaletę, że sprawia, że ​​wydajesz się naprawdę zły. "Komputer, zrób to." "Brak dostępu". "ZRÓB TO!!"
nickf
To nie jest mało znane! :-)
hoyhoy
10
Podobne rzeczy możesz zrobić: mkdir testdir; cd !$.. To działa cd [last word of previous line](w przykładzie cd testdir)
dbr
13
Make Me A Sandwich Sudo !!
Kibbee
Jeśli lubisz !!,! $ I! -1: ^ foo ^ bar, będziesz także "wiązał spację: magiczną spację". stackoverflow.com/questions/603696/…
Yoo
81

Moim ulubionym jest '^ string ^ string2', który przyjmuje ostatnie polecenie, zamienia string na string2 i wykonuje je

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

Przewodnik po historii linii poleceń Bash

ustawione
źródło
To nie jest chciwe. Jak sprawić, by był chciwy?
Altreus
9
!!:gs/ehco/echo/
andre-r
Niezbędna jest druga strona tego przewodnika
jmoz
1
@ andre-r: !!:gs/ehco/echo/wykonuje globalne wyszukiwanie i zamień przy ostatnim poleceniu (przyznaj !!w stackoverflow.com/questions/68372/ ... ). To nie jest równoznaczne z ^ehco^echozastąpieniem jednego wystąpienia „ehco” - dokładniejsza byłaby odpowiedź !!:s/ehco/scho.
Iceland_jack
64

Przemianować

Przykład:

$ 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

Tak przydatne

Jiaaro
źródło
3
Wow, byłem kretynem przez te wszystkie lata, używając do tego trików basename, mv i {}. / uderzenie w czoło.
Gregg Lind
7
rename nie jest jednak specyficzne dla bash / readline, jak inne posty.
działa
1
zmv z dystrybucji zsh jest w większości przypadków znacznie lepszy.
ZyX
Util-linux-ng ma również polecenie zmiany nazwy i nie jest takie, jak wymienione w tej odpowiedzi. Opisane tutaj polecenie to tak naprawdę mmv .
Cristian Ciupitu
60

Jestem fanem !$, !^a !*expandos, wracając z najnowszej linii złożone polecenia: ostatniego elementu pierwszego elementu zakaz poleceń i wszystkich elementów non-Command. To dowcip (zwróć uwagę, że powłoka najpierw wypisuje polecenie):

$ 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

Jest to przydatne, gdy, powiedzmy ls filea fileb, i chcesz edytować jeden z nich: vi !$czy obie z nich: vimdiff !*. Można go również uogólnić na „ nth argument” w następujący sposób:

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

Wreszcie, dzięki nazwom ścieżek, możesz uzyskać dostęp do części ścieżki, dołączając :hi :tdo dowolnego z powyższych rozwinięć:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
Pi.
źródło
'echo !! 2' nie działało dla mnie i z późniejszego postu zobaczyłem, że myślę, że to powinno być: 'echo!: 2'
user13060
8
dodaj "bind Space: magic-space" do .bashrc i innych! kombinacja zostanie automatycznie rozszerzona po naciśnięciu spacji.
Yoo
47

Podczas uruchamiania poleceń czasami chcę uruchomić polecenie z poprzednimi argumentami. Aby to zrobić, możesz użyć tego skrótu:

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

Od czasu do czasu, zamiast używania funkcji find, przerywam pętlę jednowierszową, jeśli potrzebuję uruchomić kilka poleceń na liście plików.

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

Konfigurowanie opcji historii wiersza poleceń w moim .bash_login (lub .bashrc) jest naprawdę przydatne. Poniżej znajduje się zbiór ustawień, których używam na moim Macbooku Pro.

Ustawienie następujących opcji sprawia, że ​​bash usuwa zduplikowane polecenia z historii:

export HISTCONTROL="erasedups:ignoreboth"

Podnoszę też dość wysoki rozmiar mojej historii. Dlaczego nie? Wydaje się, że nie spowalnia to niczego w dzisiejszych mikroprocesorach.

export HISTFILESIZE=500000
export HISTSIZE=100000

Inną rzeczą, którą robię, jest ignorowanie niektórych poleceń z mojej historii. Nie musisz pamiętać polecenia wyjścia.

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

Na pewno chcesz ustawić histappend. W przeciwnym razie bash nadpisze twoją historię przy wyjściu.

shopt -s histappend

Inną opcją, której używam, jest cmdhist. Umożliwia to zapisywanie poleceń wielowierszowych w historii jako jedno polecenie.

shopt -s cmdhist

Wreszcie w systemie Mac OS X (jeśli nie używasz trybu vi), będziesz chciał zresetować <CTRL> -S przed zatrzymaniem przewijania. Uniemożliwia to bashowi zinterpretowanie tego jako wyszukiwania do przodu.

stty stop ""
hoyhoy
źródło
6
Znajduję „Alt-”. znacznie lepsze niż „!!: *” do powtarzania ostatniego słowa ostatniego polecenia.
Weidenrinde
Dodatki do historii: 1. regularnie zapisuj historię (za pomocą -a, jeśli masz otwartych wiele powłok naraz) export PROMPT_COMMAND = "history -a" 2. Alias ​​do odczytywania historii z innych powłok. alias - h = 'historia -n; historia | grep '
Weidenrinde,
export HISTIGNORE = "[] *" nie jest konieczny, ponieważ HISTCONTROL = ignore oba powinny zrobić to samo
Weidenrinde
Kolejna fajna rzecz dla historii: eksport HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde
Aby zaoszczędzić kilka naciśnięć klawiszy z "cd !!: *", spróbuj "cd! $". "! $" Zostanie zinterpretowane jako ostatni argument twojego ostatniego polecenia.
Tim Stewart,
43

Jak wyświetlić tylko podkatalogi w bieżącym?

ls -d */

To prosta sztuczka, ale nie wiesz, ile czasu potrzebowałem, aby ją znaleźć!

edomaur
źródło
2
Doskonały! Przez te wszystkie lata najlepsze, co mogłem wymyślić alias lsd='ls -F | grep --color /', to wymienienie tego samego, ale w bardziej kiepski sposób. Jednak dla ułatwienia analizowania będzie zawierał jeden katalog w każdym wierszu. Zmodyfikowałem twoje polecenie, aby zrobić to samo:ls -d1 */
Artem Russakovskii
jak to działa? "ls -d" wyświetla tylko. (co jest dziwne), ale "ls -d * /" działa.
Yoo
1
To trochę skomplikowane ... „ls -d” jest podobne do „ls -d ./”, a „ls -d /” do „ls -d ./*/”. Przełącznik '-d' ustawia 'ls' tu wyświetla tylko pozycje katalogu, ale jeśli nie podasz żadnego parametru, użyje bieżącego katalogu jako parametru, więc * ma tylko "." katalog do listy ...
edomaur
1
Nie mogę uwierzyć, że nigdy wcześniej tego nie odkryłem. Świetna wskazówka.
Nick Dixon
Żadnych słów, po prostu wow !!! :)
dimba
41

ESC.

Wstawia ostatnie argumenty z ostatniego polecenia bash. Przydaje się bardziej niż myślisz.

cp file /to/some/long/path

Płyta CD ESC.

amrox
źródło
To działa dla mnie (bash). Zwróć uwagę, że naciśniesz klawisz esc, a następnie klawisz kropki. Bez myślnika ani nic.
Howler,
9
Również alt-. to to samo.
Mark Baker
Tak, to tylko Bash. Ale <esc> (lub Alt- lub Meta-) _ jest powiązane z tą samą funkcją, a <esc> -_ również działa w trybie vi.
Nick Dixon
@hendry w moim zsh to faktycznie działa. Może używasz trybu vi?
ZyX
Użyj tagu kbd dla uderzeń z klawiatury: <kbd> ESC </kbd> (ale nie gra zbyt dobrze razem z formatowaniem / wcięciami kodu).
użytkownik nieznany
36

Jasne, że możesz " diff file1.txt file2.txt", ale Bash obsługuje podstawianie procesów , co pozwala diffna wyświetlanie poleceń.

Na przykład, powiedzmy, że chcę się upewnić, że mój skrypt daje oczekiwane wyniki. Mogę po prostu zawinąć mój skrypt w <() i przesłać go, diffaby uzyskać szybki i brudny test jednostkowy:

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

Jako inny przykład, powiedzmy, że chcę sprawdzić, czy dwa serwery mają zainstalowaną tę samą listę RPM. Zamiast sshingować do każdego serwera, zapisywać każdą listę RPM w osobnych plikach i robić diffna tych plikach, mogę po prostu zrobić na diffmojej stacji roboczej:

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

Więcej przykładów można znaleźć w Przewodniku po zaawansowanych skryptach Bash pod adresem http://tldp.org/LDP/abs/html/process-sub.html .

Philipa Durbina
źródło
35

Moim ulubionym poleceniem jest „ls -thor”

Przywołuje moc bogów do sporządzania listy ostatnio zmodyfikowanych plików w wygodnym do odczytu formacie.

user10109
źródło
6
Przypomina mi inną, całkowicie bezużyteczne, ale również polecenia zabawny: ls -bart -simpson -ruls. S, ICNR
filiprem
„ls -tor” jest również przydatne, ponieważ można szybko znaleźć duże pliki. Poza tym oryginalna szwedzka pisownia imienia boga piorunów to w rzeczywistości „Tor”.
Dala
W języku duńskim można użyć, ls -lortktóre jest duńskim słowem oznaczającym „gówno”. Pomijanie jakichkolwiek grup i nie dostaniesz gniewu Valhala :)
Jesper Rønn-Jensen
1
można by to również powiedzieć jak "ls -lotr", co najwyraźniej ma coś wspólnego z Tolkienem i Władcą Pierścieni :)
ADEpt
28

Bardziej nowość, ale jest sprytna ...

10 najczęściej używanych poleceń:

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

Przykładowe dane wyjściowe:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi
ctcherry
źródło
1
Oto krótsza, szybsza wersja:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Wstrzymano do odwołania.
25

^ R wyszukiwanie wstecz. Naciśnij ^ R, wpisz fragment poprzedniego polecenia, które chcesz dopasować, i naciskaj ^ R, aż znajdziesz to, które chcesz. Wtedy nie muszę pamiętać ostatnio używanych poleceń, które wciąż są w mojej historii. Nie tylko bash, ale także: ^ E na koniec wiersza, ^ A na początek wiersza, ^ U i ^ K, aby usunąć odpowiednio przed i za kursorem.

user10741
źródło
2
Z jakiegoś powodu nigdy nie pamiętam ^ U. Czy nie ma też skrótu do usuwania słowa?
hoyhoy
1
^ W usuwa słowo przed kursorem. (Możesz edytować swoją odpowiedź za pomocą tego.)
Jon Ericson,
2
^ R jest tak przydatne, że wspomniano o tym w pytaniu :)
Mark Baker
20

Często mam aliasy dla vi, ls itp., Ale czasami chcesz uciec od aliasu. Po prostu dodaj ukośnik do polecenia z przodu:

Na przykład:

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

Fajnie, prawda?

Srikanth
źródło
Możesz także uruchomić command- zobacz SHELL BUILTIN COMMANDSw podręczniku Bash.
Iceland_jack
17

Oto kilka poprawek konfiguracji:

~/.inputrc:

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

Działa to tak samo, jak ^Rprzy użyciu klawiszy strzałek. Oznacza to, że mogę wpisać (np.), A cd /media/następnie nacisnąć strzałkę w górę, aby przejść do ostatniej rzeczy, do której chciałbym wejść cdw /media/folderze.

(Używam terminala Gnome, może być konieczna zmiana kodów ucieczki dla innych emulatorów terminala.)

Uzupełnianie Bash jest również niezwykle przydatne, ale jest o wiele bardziej subtelnym dodatkiem. W ~/.bashrc:

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

Umożliwi to uzupełnianie tabulatorami dla każdego programu (np. Próba uzupełniania tabulatorami, gdy wiersz poleceń zaczyna się od, evincepokaże tylko pliki, które evince mogą otworzyć, a także opcje wiersza poleceń uzupełniania tabulatorami).

Ładnie działa z tym również w ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
Porges
źródło
+1 bash_completion jest niesamowity
prestomation
Na komputerze Mac przeszukiwanie historii za pomocą klawiszy strzałek można włączyć za pomocą: bind '"\ e [A"': history-search-backward bind '"\ e [B"': history-search-forward
Asmus
17

Często używam:

:pModyfikator wydrukować wynik historii. Na przykład

!!:p

Wydrukuje ostatnie polecenie, abyś mógł sprawdzić, czy jest poprawne, przed ponownym uruchomieniem. Po prostu wejdź, !!aby go wykonać.

W podobnej żyle:

!?foo?:p

Przeszuka twoją historię w poszukiwaniu najnowszego polecenia, które zawierało ciąg „foo” i wydrukuje je.

Jeśli nie musisz drukować,

!?foo

wyszukuje i wykonuje je od razu.

Steve Lacey
źródło
2
Zamiast używać: p, możesz również użyć magic-space: stackoverflow.com/questions/603696/ ...
Yoo,
aby rozszerzyć historyczne sterowanie bez uruchamiania confiure magick-space w bashrcbind Space:magic-space # !pin<space>
SergioAraujo,
16

Mam tajną broń: shell-fu.

Istnieją tysiące sprytnych wskazówek, fajnych sztuczek i skutecznych przepisów, które przez większość czasu mieszczą się w jednej linii.

Jeden, który kocham (ale trochę oszukuję, ponieważ używam faktu, że Python jest teraz zainstalowany na większości systemów Unix):

alias webshare='python -m SimpleHTTPServer'

Teraz za każdym razem, gdy wpiszesz „webshare”, bieżący katalog będzie dostępny przez port 8000. Naprawdę fajnie, gdy chcesz udostępniać pliki znajomym w sieci lokalnej bez klucza USB lub zdalnego katalogu. Przesyłanie strumieniowe wideo i muzyki też będzie działać.

I oczywiście klasyczna bomba z widelcem, która jest całkowicie bezużyteczna, ale wciąż daje dużo radości:

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

Nie próbuj tego na serwerze produkcyjnym ...

e-satis
źródło
Chyba nie powinienem udostępniać w sieci /
Yoo
Myślę, że możesz uprościć polecenie do python -m SimpleHTTPServer(chyba że brakuje mi czegoś wyjątkowego, co robi oryginalne polecenie
Jesper Rønn-Jensen
Meh. Na serwerze produkcyjnym ta bomba widelca zostanie po prostu stłumiona przez system operacyjny; istnieją ograniczenia dotyczące liczby procesów, które może utworzyć każdy użytkownik.
Donal Fellows
3
@Donal: Powinieneś spróbować i zgłosić swoje odkrycia.
Michael Foukarakis
12

Możesz użyć polecenia obserwuj w połączeniu z innym poleceniem, aby wyszukać zmiany. Przykładem tego było, gdy testowałem router i chciałem uzyskać aktualne dane dotyczące takich rzeczy, jak stosunek sygnału do szumu itp.

watch --interval=10 lynx -dump http://dslrouter/stats.html
HFLW
źródło
Polecenie zegarka jest naprawdę fajne. Po raz pierwszy przeczytałem o tym w książce Linux Server Hacks około pięć lat temu. Kto wiedział, że istnieje?
hoyhoy
11
Co u licha „oglądanie” ma wspólnego z bashem?
Artem Russakovskii
11
type -a PROG

w celu znalezienia wszystkich miejsc, w których dostępny jest PROG, zwykle gdzieś w ~ / bin, a nie w / usr / bin / PROG, którego można by się spodziewać.

dajobe
źródło
1
Informuje również, czy jest to funkcja, czy alias. Jeśli jest w wielu miejscach w Twoim PATH, pokaże każdy z nich.
Wstrzymano do odwołania.
11

Lubię konstruować polecenia za pomocą echa i przesyłać je do powłoki:

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

Czemu? Ponieważ pozwala mi spojrzeć na to, co zostanie zrobione, zanim to zrobię. W ten sposób, jeśli mam okropny błąd (na przykład podczas usuwania katalogu domowego), mogę go złapać, zanim to się stanie. Oczywiście jest to najważniejsze w przypadku działań destrukcyjnych lub nieodwołalnych.

Jon Ericson
źródło
1
Możesz użyć find -print0 i xargs -0, aby uniknąć problemów z plikami i folderami zawierającymi spacje.
neu242
Lub unikaj tworzenia i pracy z plikami i folderami ze spacjami w nazwie. ;-) Oczywiście, jeśli pracujesz z nazwami wygenerowanymi przez użytkowników, Twoja sugestia jest niezbędna.
Jon Ericson
4
Dlaczego miałbyś dodawać "| ksh -s", skoro mógłbyś po prostu usunąć "echo"?
Yoo
Nie trzeba $ find dir -name \\*~ -exec rm {} +
potokować
10

Podczas pobierania dużego pliku dość często robię:

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

A potem po prostu ctrl + c, kiedy skończę (lub jeśli lszwraca wartość niezerową). Jest podobny do watchprogramu, ale zamiast tego używa powłoki, więc działa na platformach bez watch.

Innym przydatnym narzędziem jest netcat lub nc. Jeśli zrobisz:

nc -l -p 9100 > printjob.prn

Następnie możesz skonfigurować drukarkę na innym komputerze, ale zamiast tego użyj adresu IP komputera z uruchomionym programem Netcat. Gdy zadanie drukowania jest wysyłane, jest odbierane przez komputer z uruchomionym programem Netcat i wrzucane do printjob.prn.

Dreamlax
źródło
Dlaczego to, a nie na przykład wget?
porges
Spróbuj watch ls -la <filename>(użyj -n5, jeśli nie lubisz domyślnych 2 sekund).
Ted Percival,
1
@Ted watchnie jest jednak dostępny na wszystkich platformach, takich jak Solaris, Mac OS X itp. @Porges, nie wiesz, co masz na myśli. Czy wget może również nasłuchiwać na porcie?
dreamlax
10

pushdi popdprawie zawsze się przydają

jdt141
źródło
10

Jednym z preferowanych sposobów nawigacji, gdy używam wielu katalogów w bardzo różnych miejscach w hierarchii drzewa, jest użycie acf_func.sh (wymienione poniżej). Po zdefiniowaniu możesz to zrobić

Płyta CD --

aby zobaczyć listę ostatnich katalogów z menu numerycznym

cd -2

aby przejść do drugiego najnowszego katalogu.

Bardzo łatwy w użyciu, bardzo poręczny.

Oto kod:

# 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
źródło
10

Rozwiń skomplikowane linie przed uderzeniem w przerażające wejście

  • Alt+ Ctrl+ e- shell-expand-line (może wymagać użycia Esc, Ctrl+ ena twojej klawiaturze)
  • Ctrl+ _- cofnij
  • 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

&do.

bobbogo
źródło
+1, zawsze boję się wciskać Enter:)
João Portela
Nie znałem żadnego z nich. Cofnij to zabójca. Dobry do każdej edycji wiersza poleceń.
Philippe A.
9

Zawsze lubiłem:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

Używam również shopt -s cdable_vars, wtedy możesz tworzyć zmienne bash do wspólnych katalogów. Dlatego dla drzewa źródłowego mojej firmy tworzę kilka zmiennych, takich jak:

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

mogę przejść do tego katalogu według cd Dcentmain.

Drew Frezell
źródło
Home i End robią to samo, co crtl-A i ctrl-E.
davidfg4
Pomaga to na laptopach Mac, które nie mają klawiszy Home i End.
jamesh
Niestety ctrl-A jest również screendomyślnie klawiszem Escape . Zmieniam to na ctrl-X w moim .screenrc, ale wtedy nie jestem użytkownikiem emacsa.
system PAUSE
Nieco powiązana z opcją cdable_vars, istnieje również zmienna środowiskowa CDPATH. Ale to działa inaczej, ponieważ ustawiasz katalog nadrzędny, podobnie jak w PATH. Dzięki cdable_vars zyskujesz większą kontrolę.
Zecc
1
Więcej na liście skrótów: CTRL + K, aby usunąć wszystko od kursora do końca linii, CTRL + U, aby usunąć wszystko przed kursorem, ALT + F / ALT + B, aby przenieść jedno słowo do przodu / do tyłu (lub CTRL + strzałka w lewo / CTRL + strzałka w prawo). +1 dla cdable_vars!
Philippe A.
8

pbcopy

Spowoduje to skopiowanie do schowka systemu Mac. Możesz przesłać do niego polecenia ... spróbuj:

pwd | pbcopy

Max Masnick
źródło
NB! To jest polecenie specyficzne dla komputerów Mac.
Dala
To nie są: alias pbcopy='xsel --clipboard --input' i 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
źródło
Użyj history 10zamiast history | tail -10(co powinno być tail -n 10przy okazji, ponieważ ta składnia jest przestarzała).
Wstrzymano do odwołania.
7

Użycie 'set -o vi' z linii poleceń lub lepiej, w .bashrc, przełącza cię w tryb edycji vi w linii poleceń. Zaczynasz w trybie „wstaw”, więc możesz pisać i cofać jak zwykle, ale jeśli popełnisz „duży” błąd, możesz nacisnąć klawisz esc, a następnie użyć „b” i „f” do poruszania się, tak jak robisz to w vi. cw, aby zmienić słowo. Szczególnie przydatny po wywołaniu polecenia historii, które chcesz zmienić.

Leonard
źródło
7

Podobnie jak w przypadku wielu powyższych, moim obecnie ulubionym jest naciśnięcie klawisza [alt]. (Klawisze Alt i „.” Razem) to jest to samo co $! (Wstawia ostatni argument z poprzedniego polecenia) poza tym, że jest natychmiastowy i dla mnie łatwiejszy do wpisania. (Po prostu nie można go używać w skryptach)

na przykład:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
user11535
źródło
Spróbuj też połączyć to z Alt- [0-9] (wciśnij pierwszą kombinację, potem puść, potem drugą). np. jeśli ostatnim poleceniem było „mv foo bar”, a następnie „Alt-0 Alt-”. daje „mv”, „Alt-1 Alt-”. daje „foo”, „Alt-2 Alt-”. i podstawowy Alt-. obaj dają „bar” itp.
Sam Stokes
1
Spróbuj także nacisnąć Alt-. więcej niż jeden raz (lub naciśnij klawisz Alt, przytrzymaj go, naciśnij wiele razy kropkę, a następnie zwolnij klawisz Alt). Jest to podobne do naciśnięcia Ctrl-R więcej niż jeden raz.
Yoo
7

Połącz wiele poleceń razem, używając && polecenia :

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

lub

kill -9 1111 && ./start.sh
TChen
źródło
1
jeśli jedno zawiedzie, drugie polecenie nie zostanie wykonane (szybko się nie powiedzie, jak w programowaniu)
Frederic Morin
1
Odwrotnym jest użycie logiki lub „||” w którym prawa strona zostanie wykonana tylko wtedy, gdy lewa strona jest fałszywa. Przykład: <kod> polecenie_1 || command_2 </code>
dala