Najważniejsze wskazówki i porady dotyczące wiersza poleceń systemu Linux?


112

Chciałbym otworzyć dyskusję, która zgromadziłaby najlepsze praktyki i wskazówki dotyczące wiersza poleceń systemu Linux (CLI).

Szukałem takiej dyskusji, aby podzielić się poniższym komentarzem, ale jej nie znalazłem, stąd ten post.

Mam nadzieję, że wszyscy moglibyśmy się z tego nauczyć.

Zapraszamy do dzielenia się wskazówkami dotyczącymi Basha, grep, sed, AWK, / proc i wszystkimi innymi powiązanymi administracjami systemami Linux / Unix, najlepszymi praktykami programowania powłoki z korzyścią dla nas wszystkich.


Dlaczego tylko Linux? Wiele wskazówek może być użytecznych w prawie wszystkich smakach Uniksa.
mouviciel

To pytanie może być nieco szersze - jest wystarczająca liczba najlepszych praktyk w wierszu poleceń systemu Linux / Unix, aby wypełnić całe książki ...
Jonik

Zgadzam się, że wskazówki unixowe, które można zastosować do Linuksa, również są bardzo mile widziane, napisałem linux, ponieważ A. Z tym tutaj współpracujemy. B. ponieważ w ostatnich latach zyskuje szerszą publiczność niż Unix.
Maxim Veksler

Myślę, że to świetny pomysł, aby skompletować listę najbardziej przydatnych i interesujących poleceń, których ludzie używają.

Czy któreś z nich są istotne? refspecs.freestandards.org

Odpowiedzi:


111

Użyj screena , darmowego multipleksera terminali opracowanego przez GNU Project, który pozwoli ci mieć kilka terminali w jednym.

Możesz rozpocząć sesję, a terminale zostaną zapisane nawet po utracie połączenia, dzięki czemu możesz wznowić je później lub z domu.


2
Najczęściej używane przełączniki to „screen -D -R” do odłączania i wznawiania mojej ostatniej sesji screen oraz „screen -x”, aby wyświetlić tę samą sesję screen z wielu loginów. Zdobądź także fajny plik .screenrc z witryny dotfiles.org/.screenrc
Nick Devereaux

4
Kolejną fajną rzeczą dotyczącą ekranu jest to, że możesz udostępnić terminal innym osobom, gdy chcesz nad czymś współpracować, używając screen -x
gareth_bowles

101

SSH!
SSH to rozkaz boga - myślę, że jest to najcenniejsze z możliwych rozkazów do nauki. Opcje mogą być dość zniechęcające, ale wygląda na to, że ciągle uczę się korzystać z nowych opcji wiersza polecenia dla SSH, których nigdy nie uważałem za konieczne. Być może w tym momencie korzystałem z nich wszystkich.

Im częściej go używasz, tym więcej się o nim uczysz. Możesz go użyć do robienia niesamowitych rzeczy.

Uwaga: WSZYSTKIE te rzeczy są możliwe do wykonania zdalnie bez konfiguracji na serwerze, z wyjątkiem uruchomienia serwera ssh.

Zamontuj system plików przez Internet

wyszukaj w sieci SSHFS

Przekaż polecenia .

Protokół SVN + SSH to Subversion ze zdalnego klienta na serwer bez uruchomionego na nim ŻADNEGO DEAMONA! Komenda SVN uruchamia serwer przez powłokę ssh i przekazuje informacje tam iz powrotem przez istniejący potok. Program rsync robi to samo, działa na serwerze bez demona rsync, uruchamiając się przez SSH. Łatwo jest pisać własne pliki bash, aby wykonywać podobne sztuczki.

Łańcuch, aby przejść przez zapory ogniowe

Używam tego cały czas, aby przeskakiwać przez mój serwer linux w domu do mojego komputera Mac.

Przekazywanie portów:
Wydaje się tylko umiarkowanie przydatne, dopóki nie uświadomisz sobie, że możesz odbić się przez zaporę domową i skonfigurować router w domu z pracy tak, jakbyś robił to z sieci domowej).

Przekaż żądania X:

To kolejny niesamowity. Z serwerem X działającym w systemie zdalnym lub bez niego, możesz uruchomić program X-Windows, a okno pojawi się na ekranie lokalnym. Wystarczy użyć przełącznika -X, to wszystko!

Ponieważ nie musisz mieć serwera X działającego na zdalnym serwerze, wpływ procesora na Twój serwer jest minimalny, możesz mieć serwer TINY Linux, który obsługuje ogromne aplikacje na potężnym komputerze z systemem Windows i cygwin / X.

Oczywiście VI i EMACS działają na SSH, ale kiedy pracuję w domu, czasami chcę więcej. Używam ssh -X, aby uruchomić kopię Eclipse! Jeśli Twój serwer ma większą moc niż laptop, masz GUI na swoim laptopie, ale kompilacje są wykonywane na serwerze, więc nie martw się o obciążenie systemu.

Uruchom w plikach wsadowych

(co oznacza uruchomienie lokalnego pliku wsadowego, który „robi rzeczy” w innych systemach):

Dwie rzeczy sprawiają, że ta jedna jest fajna. Jednym z nich jest wyeliminowanie monitów o hasło przy użyciu (bezpieczniejszych) kluczy szyfrowania. Po drugie, możesz podać polecenie w interfejsie SSH CLI. Użyłem tego na kilka interesujących sposobów - na przykład, gdy kompilacja kończy się niepowodzeniem na zdalnym serwerze, włączam SSH do mojego komputera i odtwarzam plik dźwiękowy).

Pamiętaj, że możesz przekierować dane wyjściowe ze zdalnego polecenia i użyć go w lokalnym pliku wsadowym, abyś mógł także lokalnie dostosowywać kompilację działającą na serwerze.

Wbudowany w Mac

Zarówno serwer, jak i klient są wbudowane zarówno w system Mac, jak i Linux. W przypadku komputerów Mac i Ubuntu włączenie serwera jest tak proste, jak znalezienie odpowiedniego pola wyboru.

Na komputerze zainstaluj cygwin lub cygwin / X (cygwin / X pozwoli ci przesłać dane wyjściowe x-window z komputera z systemem Linux na komputer z systemem Windows - instaluje serwer X)

Ważne wskazówki / plik konfiguracyjny

Nigdy nie używaj portu 22 w zaporze. Dostaniesz wiele prób włamań, po prostu nie warto. Po prostu pozwól zaporze przekierować inny port na twój serwer.

Istnieje wiele opcji konfiguracji, które pozwalają znacznie uprościć polecenia ssh. Oto mój przykład w pracy:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Kiedy piszę „ssh home” (nic więcej), działa to tak, jakbym napisał:

ssh -p 12345 bill@billshome.hopto.org

a następnie przesyła mój lokalny port 1025 do mojego systemu „mac” w domu. Powodem tego jest to, że mam inny wpis w moim pliku:

Host mac
    hostname localhost
    port=1025

więc gdy zrobię „ssh home” i nadal mam otwarte okno, mogę wpisać „ssh mac”, a komputer w tym miejscu będzie próbował połączyć się z własnym portem 1025, który został przesłany do „mac: 22 ”drugim poleceniem, więc połączy się z moim komputerem Mac w domu za pośrednictwem zapory.

Edycja - fajny skrypt!

Odkopałem stary skrypt, który po prostu uwielbiam - musiałem wrócić i opublikować go dla każdego, kto mógłby być zainteresowany. Skrypt nazywa się „authMe”

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Jeśli masz ten skrypt w katalogu domowym i istnieje host, z którym możesz się połączyć (przez ssh), możesz wpisać „./authMe nazwa_hosta”.

W razie potrzeby utworzy dla ciebie publiczną / prywatną parę kluczy, następnie prześle ssh na inny komputer i skopiuje twój klucz publiczny (polecenie ssh poprosi o podanie hasła ...)

Po tym komenda SSH nie powinna już pytać o hasło podczas dołączania do tego zdalnego systemu, użyje klucza publicznego / prywatnego.

Jeśli Twój komputer zdalny nie zawsze jest bezpieczny, powinieneś rozważyć ustawienie „hasła” po wyświetleniu monitu.

Możesz także skonfigurować serwer ssh na drugim końcu, aby nie zezwalał na hasła tekstowe (tylko klucze) dla dodatkowego bezpieczeństwa.


4
+1 bardzo ładny i kompaktowy post
Karsten

2
Mała uwaga na temat SSH przez port 22: pod warunkiem, że masz dobre hasło roota, a użytkownicy nie mają strasznych haseł, wystarczy uruchomić fail2ban (lub coś podobnego), aby powstrzymać próby włamania. Bardzo denerwujące było dla mnie utrzymanie SSH na innym porcie.
David Wolever,

1
Czasami może to być irytujące, ale ilość połączeń była po prostu przerażająca. Wiem, że nie powinni się przedostawać, ale to tak, jakby ktoś chodził do domu i bawił się klamką co minutę - po prostu denerwował.

W większości wersji ssh jest wbudowana wersja twojego ostatniego polecenia, nazywa się ssh-copy-idona i jest tak prosta, jakssh-copy-id user@someserver
JamesHannah

Innym sposobem na wykonanie sztuczki „ssh mac” jest użycie dyrektywy ProxyCommand w pliku .ssh / config. Host Mac ProxyCommand ssh -q home "nc% h% p" Spowoduje to uruchomienie netcat (nc) w domu i przekierowanie połączenia ssh prosto na mac. Uważam te łatwiejsze do sieci (na przykład, jeśli chcesz podłączyć do „domu”, aby dostać się do „pracy” bastionu dostać się do „pracy serwera WWW.”
toppledwagon

73

Lubię korzystać

cd -

aby przejść do poprzedniego katalogu. Bardzo przydatne!


6
Nigdy tego nie wiedziałem! Dzięki! W powiązanej naturze pushd i popd robią coś podobnego, budując stos reż. Tego rodzaju sztuczki pomagają poruszać się po głębokiej strukturze katalogu.

To jest czyste oświecenie.
Manuel Ferreria

69

Niedawno odkryłem pvpolecenie (przeglądarka potoków), które jest jak cat, ale ze szczegółami przesyłania.

Więc zamiast

$ gzip -c access.log > access.log.gz

Możesz użyć

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Więc zamiast nie mieć pojęcia, kiedy operacja się zakończy, teraz będziesz wiedział!

Dzięki uprzejmości Peterisa Kruminsa


$ gzip -c access.log> access.log.gz Dlaczego nie tylko: $ gzip access.log

Och, to działa :) Właśnie wziąłem przykład ze strony Peterisa.
Nick Devereaux,

To wygląda na dobre stare tee(1).
Daniel C. Sobral

Niezwykle przydatne narzędzie, o którym zawsze zapominam :-(
Patrick


46

Naciśnij Ctrl-R i zacznij pisać polecenie (lub dowolną jego część) - przeszukuje historię poleceń. Ponowne wciśnięcie Ctrl-R spowoduje przejście do następnego dopasowania, enter wykonuje aktualnie wyświetlane polecenie, a strzałka w prawo (przynajmniej) pozwoli ci go najpierw edytować.

$ (reverse-i-search)`svn': svn status

Użyłem Linuksa przez około 7 lat jako mój główny system operacyjny, zanim się tego dowiedziałem, ale teraz, gdy go znam, jest całkiem przydatny.


Dzięki. Korzystałem z wyszukiwania wstecznego, ale nie byłem w stanie dowiedzieć się, jak przejść do następnego meczu.
Adam,

Ctrl-S przeskakuje do następnego meczu. Być może trzeba będzie zrobić stty -ixonnajpierw, aby wyłączyć znaczenie kontroli przepływu XON / XOFF (powoduje to również, że Ctrl-Q jest dostępny, domyślnie jest odwzorowany tak samo, jak wstawka cytowana Ctrl-V, ale można go zmienić na coś innego ). Zobacz man sttyi man readlinewięcej informacji. sttyKomenda może zostać dodany do~/.bashrc
Dennis Williamson

45

Wiersz poleceń to zabawna rzecz. Myślę, że tyle sam możesz się nauczyć, a reszty uczysz się przez przypadek, obserwując kogoś innego za pomocą wiersza poleceń.

Przez lata używałem powłoki, starannie wpisując nazwy katalogów ręcznie. Pewnego dnia patrzyłem, jak kolega bawi się w systemie, a on wciąż naciskał klawisz tab. Zapytałem „dlaczego trafiasz na kartę?”. Odpowiedź: próbuje uzupełnić katalog lub nazwę pliku. Kto by zgadł - zakładka! Wpisz trochę pliku lub katalogu, wciśnij tab, a spróbuje dokończyć to, co wpisałeś (zachowanie zależy od tego, która powłoka).

Pewnego dnia przyjaciel powiedział, że obserwuje mnie w wierszu poleceń i obserwował, jak piszę:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Kto by zgadł !? Nigdy nie wiedział o popd/ pushd. Chyba jesteśmy nawet ...


1
Dla mnie uzupełnienie zakładki wydaje się czymś „oczywistym”, bardzo podstawowym, ale nigdy nie wiedziałem o popd / pushd. Rzeczywiście zabawne. :)
Jonik

3
Zobacz także tę odpowiedź, aby móc uzupełniać tabulatorami o wiele więcej niż polecenia, pliki i katalogi: stackoverflow.com/questions/603696//603919#603919
Jonik

1
To takie prawdziwe. Dowiedziałem się o wstecznym wyszukiwaniu historii basha (ctrl-r), obserwując kogoś. Później zrozumiałem, że była to funkcja readline i działała tak samo w innych programach, które zawierają readline (mysql, gdb, python -i, clisp itp.).
sigjuice

2
Jak możesz używać „powłoki” od lat i nie wiedzieć o uzupełnianiu tabulatorów?
prestiż

Podczas pracy z pushd / popd nie zapomnij wspomnieć o katalogach poleceń . Pokazuje, co jest na stosie pushd / popd.
slm

41

Naucz się Vima.

Jest to (prawdopodobnie) najlepszy edytor, ale z pewnością najlepszy edytor dostępny na czystym serwerze Linux.


1
gvim jest także najlepszą przeglądarką plików w systemie Windows;)

Jest to również niezwykle przydatne, ponieważ kiedy znasz vima, możesz przełączyć większość powłok w tryb vi, a nawigacja staje się niezwykle łatwa i szybka
Patrick

38

Czasami przydatne jest pozostawienie programu uruchomionego nawet po wylogowaniu. Widziałem niektóre rozwiązania, które używają do tego celu nohup, a nawet ekranu. Najprostszy o którym wiem to:

$ your_command_here & disown

Możesz także odłączyć działający program:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
Korzystanie z ekranu jest świetne, ponieważ możesz „ponownie połączyć” się z tą aplikacją z dowolnego miejsca później.
premomation

+1, nie słyszałem o odrzuceniu.
user18911

to samo się pojawiło, chociaż już robię to samo z ekranem
Andy

38

Kiedy chcę się upewnić, że używam rzeczywistego polecenia, a nie aliasu, używam wiodącego ukośnika odwrotnego:

\rm -rf ~/tmp

czy to to samo co „polecenie rm -rf ~ / tmp”?
Maxim Veksler,

Nie znałem „polecenia”, ale wygląda tak samo.
mouviciel

4
Cóż, tak, chyba że „polecenie” nie jest aliasem, w takim przypadku należy użyć polecenia \ polecenie rm -rf ~ / tmp, w takim przypadku \ rm -rf ~ / tmp jest lepsze
Jamol

@presario i uważasz, że można utworzyć alias dla „/”? Szkoda, że ​​nie mogę przegłosować komentarzy :)

Zobacz także podobne polecenie „ builtin”.
Dennis Williamson

38

Ta wskazówka sprawi, że Twój CLI będzie wygodniejszy (przynajmniej dla mnie):

utwórz plik ~ / .inputrc z następującą zawartością:

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

Załaduj ponownie bash (np. Wpisując „exec bash”). Kiedy wpiszesz prefiks polecenia i naciśniesz strzałkę w górę, przejrzysz polecenia zaczynające się od prefiksu, na przykład, jeśli wpiszesz ssh, wyświetli poprzednie połączenia ze zdalnymi powłokami. Jeśli monit jest pusty, strzałka w górę przejrzy historię w normalny sposób.


3
Zwykle wiążę je z \ e [5 ~ i \ e [6 ~ (inaczej pageup i pagedown) zamiast ponownego wiązania strzałek, ale jest to wygodniejsze niż Ctrl-R / Ctrl-S :)
ephemient

+1. Mam je powiązane z klawiszami F8 i Shift-F8, aby naśladować cmd.exe, ale ta sama zasada obowiązuje.
user18911

4
+1 zaexec bash
Dennis Williamson

Edukacyjne jest także czytanie man readlinei zapamiętywanie jego domyślnych skrótów
SaveTheRbtz

Możesz także zrobić, bind -f ~/.inputrcaby ponownie załadować inputrc bez konieczności rozpoczynania nowego bashu i usuwania obecnego środowiska.
Patrick

36

Użyj &&zamiast ;wykonywania wielu poleceń jednocześnie. Zatrzymuje się, gdy wystąpi błąd, i nie wykonuje innych poleceń.

Klasyczny przykład:

./configure && make && make install

1
Ta praktyka jest tak niedoceniana! Standardową praktyką powinno być kończenie każdego wiersza skryptu powłoki za pomocą && i używanie „true” jako ostatecznego polecenia.
user18911

3
zabawne jest to, że nie wiedziałem o ';' polecenie wcześniej - ZAWSZE użyłem „&&”.
Nick Klauer

4
Możesz uruchamiać skrypty powłoki za pomocą „#! / Bin / sh -e”. Zatrzymuje się, jeśli jakaś linia zawiedzie.
stribika

3
Możesz użyć podwójnego potoku dla klauzuli „else”:dosomething && echo "success" || echo "teh fail"
Dennis Williamson

2
Niedawno na Planecie Debian pojawiła się informacja, że ​​złym zwyczajem jest używanie -e w linii shebang. Zamiast tego użyj set -e w treści skryptu. W ten sposób skrypt nie działa inaczej, jeśli ktoś uruchomi się przy użyciu sh $ filename.
ptman

32

Podczas pisania pętli w linii poleceń w bash często poprzedzam ryzykowne polecenia poleceniem „echo”.

for item in items; do echo something-risky; done

W ten sposób widzę „coś ryzykownego” w całości, zanim zdecyduję się go uruchomić. Pomaga, gdy twoje ryzykowne polecenie zawiera zmienne rozszerzenia i globusy. A „set -x” jest bardzo przydatne podczas pisania skryptów bash.

„set -x” włącza debugowanie. Zobacz http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html, aby uzyskać informacje na temat debugowania bash.


3
Też to robię, bardzo przydatna sztuczka!
user18911

1
+1 To może być ratowanie życia! lub oszczędzanie danych ...
David Oneill

31

Wymaganie

Musisz przetestować maksymalną przepustowość między 2 serwerami.


Rozwiązanie

Na serwerze SERVER1 wykonaj:

nc -u -l 54321 > /dev/null

Na SERVER2 wykonaj:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Zobaczysz dane wyjściowe, takie jak:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

Interesującym czynnikiem jest tutaj 117 MB / s , który pokazuje rzeczywistą szerokość pasma transferu sieci.

Objaśnienie :

Gdy pakiet zacznie przepływać przez sieć, będziesz mógł zobaczyć statystyki przepustowości na SERVER2, co jest całkiem dobrym oszacowaniem rzeczywistej maksymalnej możliwej przepustowości między dwoma serwerami.

Kopiowanie przez UDP (w celu uniknięcia obciążenia TCP).

Kopiowanie z pamięci (/ dev / zero) na SERWERZE1 do pamięci (/ dev / null) na SERVER2, zapobiegając w ten sposób wąskiemu gardłu we / wy dysku.


4
Upewnij się jednak, że ssh nie jest skonfigurowany do korzystania z kompresji w .ssh / config ”. W przeciwnym razie otrzymasz naprawdę fajne liczby, które są bardzo dalekie od prawdy ;-)
Joachim Sauer

Lol tak. A SSH będzie walić w szyfrowanie i deszyfrowanie procesora, co również wyrzuci liczby.

zamiast tego
użyj netcata

+1 dla netcat.
nadwyżka

Przeredagowano, by zmienić sugestie @saua, @Daniel Von Fange i @bendin. Dziękuję za sugestie chłopaki.
Maxim Veksler,

23

Przeglądanie struktur katalogów kolorów jest łatwiejsze.

alias ls="ls --color=tty"

Edytować

alias ls="ls --color=auto"

5
Wolę --color = auto, ponieważ nie wysyła znaków kontroli śmieci, jeśli przekierowanie do pliku można również zrobić alias grep = "grep --color = auto", aby wyróżnić pasujące wzory.

+1 dla --color = auto; czy ktoś mógłby w ten sposób zwiększyć odpowiedź?
Jonik

Myślę, że tty robi to samo co auto tutaj.
joshudson

Zaktualizowano w celu odzwierciedlenia koloru = auto
Suroot

O dziwo, kolorystyka sprawia, że ​​rzeczy są dla mnie znacznie mniej czytelne. Na przykład żółto-biała nie jest dobrym wyborem kolorystycznym.

20

Kilka małych wskazówek dotyczących przeglądania dziennika:

  1. Możesz użyć tail -F aby oglądać dziennik po jego skróceniu (na przykład log4j).
  2. Możesz użyć mniej: Otwórz mniej, kliknij SHIFT + F, aby emulować zachowanie ogona. Przydatna jest także kombinacja -S, aby wyłączyć zawijanie linii. mniej pozwoli ci przeszukiwać dzienniki.

1
Dzięki tail -fniemu możesz oglądać wiele dzienników jednocześnie! Np .:tail -f log1.txt -f log2.txt
Stu Thompson

@StuThompson: Dzięki. nie wiedziałem tego. Ponadto możesz sprawdzić
Maxim Veksler

20

Dawno temu nauczyłem się sztuczki od znajomego , aby łatwo zmieniać rozszerzenie pliku:

mv my_filename.{old,new}

Rozszerzenie powłoki rozszerzy to do:

mv my_filename.old my_filename.new

Można to również wykorzystać do zmiany nazwy pliku na inne sposoby, na przykład poprzez dodanie czegoś do:

mv my_{,cool_}filename

6
Pamiętaj tylko, aby nie umieszczać symboli wieloznacznych ani innych wyrażeń wzorcowych w tym samym poleceniu, w przeciwnym razie glob może rozwinąć się do więcej niż 2 argumentów! mv *. {old, new} prawdopodobnie przyniesie naprawdę zaskakujące wyniki.

Tak, zgadzam się - to ważne zastrzeżenie :)

2
Możesz także wpisać, na przykład, ls -l /bin/ca następnie nacisnąć Alt-Shift- {a to dokończy to ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}dla Ciebie.
Dennis Williamson

19

Użyj „tar xf”, aby wyodrębnić skompresowane archiwa. J dla bzip2 i z dla gzip nie są konieczne, ponieważ tar wykryje typ pliku twojego archiwum. Ani argument „-” przed argumentami. Zaoszczędzisz dużo czasu (ponad tysiąclecia ;-)).

Lepiej jeszcze użyj cofnij do wypakowania dowolnego archiwum za pomocą jednego polecenia bez zbędnych argumentów.


Tak, mam alias ut="tar xf"- sprawia, że ​​rozpakowywanie archiwów jest jeszcze łatwiejsze.
David Wolever,

Nie działa to w przypadku niektórych dystrybucji RHEL, jeśli ich używasz.
pvsnp,

Nowa smoła ma również "J" przełącznik do sprężania do XZ (archiwa 7zip based)
Hubert Kario

Lub zainstaluj unp: packages.debian.org/sid/unp . Wydaje mi się, że jest to podobne do cofania.
Zitrax,

17

Zainstaluj pakiet bash-complete. Zawiera szereg predefiniowanych reguł ukończenia powłoki. Włącz go, wpisując „source / etc / bash_completion”, jeśli dystrybucja nie zrobi tego za ciebie. Następnie, na przykład za każdym razem, gdy wypełnisz po kpdf, zobaczysz tylko listę katalogów i plików PDF. Jest tak sprytny, jak uzupełnianie zdalnych plików po scp ssh: // server / XXX (jeśli włączyłeś logowanie bez hasła).


17

Ciągle używam tych

ALT-. (ESC +. W niektórych terminalach) kopiuje ostatnio używany argument (bardzo przydatne)

CTRL-W usuwa słowo

CTRL-L, wyczyść terminal (jak wyczyść polecenie, ale szybciej)

ALT-B (ESC + B w niektórych terminalach) przesuwa słowo do tyłu

ALT-F (ESC + F w niektórych terminalach) przesuwa słowo do przodu

CTRL-E przeskocz do EOL

CTRL-A przeskocz do BOL

Wyszukiwanie CTRL-R w historii


1
Dziękujemy za udostępnienie skrótów! Nie dostałem ALT-B / F do pracy na Macu.
Léo Léopold Hertz 준영

Niesamowity mężczyzna ....
Daud Ahmad Khokhar

16

W bash używam ! $ Dużo. Powtarza ostatni argument ostatniego polecenia:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Uruchomi on ls, a jeśli chcesz go edytować, nie musisz go ponownie wpisywać, po prostu użyj! $. Jest to bardzo przydatne w przypadku długich ścieżek / nazw plików. Również ! * Powtarza wszystkie argumenty poprzedniego polecenia. Nie używam tego tak często, ale wygląda na użyteczny.

Wiedziałem, że zostały wspomniane, ale używam vim, screen i cd - dużo.

Zapomniałem noclobber:

set -o noclobber

From man bash :

Jeśli jest ustawiony, bash nie zastępuje istniejącego pliku operatorami przekierowania>,> i i <>. Można to zmienić podczas tworzenia plików wyjściowych za pomocą operatora przekierowania> | zamiast>.


6
Nie używam $ !, ponieważ bardzo łatwo jest grubym palcem, ale lubię uderzać ^ [-. (okres ucieczki), aby uzyskać ten sam efekt.
David Wolever,

7
W zależności od klawiatury itp. Możesz to zrobić Alt-..
Dennis Williamson

Omg, mały orgazm, ty Dennis!
artefex,

14

Przełącz się z bash na zsh i zobacz, jak poprawia się Twoja wydajność:

  • Naprawdę inteligentne, uzupełniane skryptami uzupełnianie kart Uzupełnia nie tylko wiersze poleceń, ale wszystkie opcje, nazwy stron podręcznika man, nazwy pakietów (dla apt-get / emerge itp.) I co masz. I zapewnia pomocne wyjaśnienie opcji podczas realizacji. Wszystko to bez użycia miejsca przewijania po wydaniu polecenia.
  • Uzupełnianie tabulatorów symbolami wieloznacznymi; napisz cat * .txt, naciśnij tab i wybierz pomiędzy dowolnymi plikami, które pasują do wyrażenia.
  • Przełączaj katalogi, wpisując ich nazwy.
  • Kilka trybów edytora linii. Może zachowywać się jak vi lub emacs, jeśli chcesz.
  • Konfigurowalne przypisania klawiszy do robienia wszystkiego, co chcesz.
  • Motywacyjne podpowiedzi, w tym możliwość umieszczania szybkich informacji po prawej stronie ekranu i automatycznego ukrywania się podczas wpisywania długiego polecenia

Google powie Ci o wiele więcej korzyści.


1
powinieneś podać więcej niż link. brzmi interesująco, ale sprzedaj mi to, stary!

Czy udało im się włączyć obsługę Unicode?

@Cory W porządku, po prostu nie chciałem plagiatować i pisanie własnych było zbyteczne, gdy jest już tyle dobrych rzeczy napisanych przez innych :)

@kyku tak, istnieje poprawne wsparcie dla Unicode od około roku.

Wygląda fajnie. dam temu szansę!

13

Old school, przenoszenie drzewa katalogów z jednego miejsca do drugiego, zachowanie dowiązań symbolicznych, uprawnień i wszystkich innych dobrych rzeczy:

tar cBf - . | (cd /destination; tar xvBpf -)

lub przez sieć

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Nowa szkoła:

rsync -urltv . /destination

lub przez sieć

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Trochę mniej pisania i łatwiejszy w użyciu przez ssh.
ephemient

1
-a jest tym samym co „-rlptgoD” - to jest rekurencja, kopiowanie dowiązań symbolicznych jako dowiązań symbolicznych, zachowanie permów, zachowanie znaczników czasu, zachowanie grup, zachowanie właścicieli, kopiowanie plików urządzeń i plików specjalnych jako plików urządzeń i plików specjalnych. Również między komputerami przydatne jest -z (kompresuj pliki przed wysłaniem, dekompresuj po otrzymaniu). rsync -avz [-e ssh] jest twoim przyjacielem :-)
dr-jan

Czy -z robi coś dobrego w stosunku do ssh? Nie sądzę.
Paul Tomblin,

rsync -avhnajlepiej na jednym komputerze - hzapewnia, że ​​twarde linki są przesyłane poprawnie bez przekształcania każdego linku w osobny plik, ale jeśli masz ogromną liczbę plików, może zużyć dużo pamięci. rsync -avzh . foo.com/destinationjest odpowiednikiem sieci i zwykle nie potrzebujesz, -e sshponieważ rsync będzie wiedział, że używa ssh.
RichVel

Obecnie używamrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Paul Tomblin

13

Wymagania : Masz katalog zawierający dużą listę plików, które chcesz usunąć. rm -r zawiedzie!

przykład

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Rozwiązanie :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Objaśnienie :

Edycja: Naprawienie wyjaśnienia po komentarzu @ephemient.

find dostarczy argumenty do rm przez maksymalną dozwoloną liczbę argumentów. Umożliwi to rm usuwanie plików partiami, co jest najszybszą znaną mi techniką bez korzystania z operacji -delete znajdowania się. Jest to równoważne z

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

które mogą okazać się przydatne, jeśli findnie są obsługiwane -exec ... +.


5
Wymienić \;z +: wtedy findbędą robić to, co xargsrobi domyślnie, czyli partia się argumenty, jak to tylko możliwe (bez uruchamiania na liście limitu argument). Lub po prostu użyj -deleteintead -exec rm(GNU Findutils potrzebne dla obu)
ephemient

Dobra wskazówka - nie znałem „+”.
codeinthehole

@ephemient: Dobry komentarz, edytowałem post.
Maxim Veksler

2
Co ciekawe, nie słyszałem o „+”.
user18911

lub po prostu find ... -delete, jeśli twoje znalezisko jest tak obdarzone.
David Wolever,

11

Używam tych dwóch wskazówek tak często, że pomyślałem, że dobrym pomysłem będzie podzielenie się:

!foo

Uruchomi ostatnie polecenie w pliku historii zaczynające się od „foo” (często używam go podczas kompilacji, !gcc ).

Drugi to skrót klawiaturowy (Ctrl + O zamiast Return), który wykona polecenie ORAZ wyświetli następne polecenie w pliku historii. Na przykład, kiedy kompiluję i testuję plik, zawsze wykonuję 3 lub 4 polecenia, make, cd do katalogu testu, uruchom test, cd do katalogu makefile. Użycie Ctrl + O znacznie ułatwia to zadanie :)

Mam nadzieję, że to pomoże!


1
+1 dla Ctrl-O
Dennis Williamson

10

Jak korzystać z subversion w Linuksie bez pomocy fantazyjnych interfejsów graficznych, które mogą być niedostępne.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

To dziwnie powstrzymuje wielu programistów od korzystania z Linuksa.


rapidsvn to fajne małe GUI dla svn pod Linuksem.

Z pewnością dostępnych jest wiele fantazyjnych, potężnych interfejsów GUI (takich jak w IntelliJ IDEA), ale podoba mi się możliwość korzystania z nich lub z wiersza poleceń (również potężnego, ale różnie) - w zależności od tego, która bardziej odpowiada bieżącej sytuacji
Jonik

Jak dotąd moim ulubionym jest NautilusSVN (podobnie jak TortoiseSVN): code.google.com/p/nautilussvn
user7655

10

Najczęściej pomijane polecenie starej szkoły: find

Wczoraj naprawiłem poważny błąd uprawnień:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Tak! Naucz się znajdować polecenie. Znajdź zmieszany z xargs, sed i awk tworzy juggernaut do przetwarzania plików!
Jonathon Watney

Zgoda! Chociaż nigdy nie pamiętam niczego o sed i awk - zawsze muszę to ponownie nauczyć! Naprawdę powinienem wydrukować ściągę.

Tak, ale nie zapomnij użyć opcji -print0 i opcji -0 do xargs, aby uniknąć trudnych problemów związanych z nazwami plików zawierającymi nietypowe znaki (np. Odwrotny ukośnik).
user18911

Tak, pewnie połowę czasu używam znaleźć to naprawić głupot uprawnienia: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Nie zapomnij o -permmożliwości findzlokalizowania plików, które mają określone uprawnienia.
Dennis Williamson

8

W przypadku powłok, takich jak bashi ksh, możesz sprawić, aby wiersz poleceń reagował na polecenia nawigacyjne, takie jak edytor tekstu:

set -o emacs

lub

set -o vi

pozwoli ci przeszukać swoją historię i poruszać się po linii poleceń w sposób, w jaki jesteś przyzwyczajony do robienia plików tekstowych (np. w trybie vi, naciśnięcie, ESCa następnie wpisanie /stringprzeszuka poprzednie komendy pod kątem „łańcucha” - możesz użyć ni Nprzenieść między meczami)


Drobna literówka: „edytorem testów” powinien być „edytor tekstu”

8

grep jest moim przyjacielem. Poważnie.

Lista .rbplików zawierających tekst class foo:

grep -l "class foo" .rb

Lista .rbplików, które nie zawierają tekstu class foo:

grep -L "class foo" *.rb

Lista .rbplików, które nie zawierają foo ani baru (możesz użyć dowolnego wyrażenia regularnego z -e, ale musisz uciec od operatorów):

grep -L -e "foo\|bar" *.rb

Możesz być zainteresowany narzędziem o nazwie „ack”, które robi to samo co grep, ale skanuje rekursywnie tylko pliki źródłowe. Spróbować (za darmo): betterthangrep.com

8

Podstawienie powłoki odbywa się za pomocą ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
Właściwie wolę „!!: gs / foo / bar”, ponieważ często stwierdzam, że foo jest wspomniane więcej niż raz w poprzednim poleceniu i chcę globalnego zamiennika (np. „Mv foo.txt foo.bak”).
user18911
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.