Terminal pokazuje> po wprowadzeniu \

Odpowiedzi:

35

Ilekroć korzystasz z wiersza polecenia, może wystąpić wystąpienie, kiedy musisz uruchomić polecenie, które jest bardzo długie. Tak więc chcesz podzielić polecenie na wiele wierszy dla lepszej czytelności i zrozumienia. Ale jeśli użyjesz nowego znaku linii, który jest wpisany Enter, powłoka pomyśli, że jest to nowe polecenie. Używasz więc \znaku nowej linii.

Zasadniczo polecenia lub skrypty bash są „interpretowane”, tj. Wykonywane wiersz po wierszu. Każda nowa linia oznacza początek nowego polecenia. Po naciśnięciu przycisku w terminalu Enterpojawi się monit o uruchomienie nowego polecenia. Tak więc nowa linia musi zostać „zmieniona”. Wpisanie, \po którym następuje, Enterpozwala podzielić bieżące polecenie na wiele wierszy, aby powłoka nie myślała, że ​​jest to nowe polecenie, ale kontynuacja poprzedniego polecenia.

> jest niczym innym jak monitem o wprowadzenie następnego wiersza polecenia.

Na przykład:
jeśli chcemy zainstalować wiele pakietów, polecenie będzie podobne

$ sudo apt install [package1] [package2] [package3] ...

Ale czasami sprawia to, że polecenie jest zagracone. Możemy więc użyć znaku \następującego Enter(znak nowej linii)

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
źródło
4
@Curiouskangaroo BTW, możesz kontrolować działanie nowego polecenia i kontynuacji wiersza , ustawiając wartości na $PS1i $PS2zmienne. Zobacz stronę podręcznika użytkownika bash, aby poznać format, i użyj, echo "'$PS2'"aby wyświetlić bieżące ustawienie.
jpaugh
14

Znak odwrotnego ukośnika ( \) jest używany jako znak ucieczki w powłoce. Jeśli użyjesz go jako ostatniego znaku w wierszu, ucieka on od nowej linii, więc możesz kontynuować polecenie w następnym wierszu zamiast go kończyć. Wskazuje na to >monit w Bash.

Przykład:

$ echo A\
> B
AB
$

Aby \podać literał swojemu poleceniu, musisz uciec przed nim, używając innego odwrotnego ukośnika:

$ echo \\
\
$
Melebius
źródło
7

[dodając (zbyt długą / złożoną) odpowiedź, ponieważ pozostałe 2 nie wspominają o wyglądzie „>” ... tzn. nie wspominają o PS2]

Wpisano: \Enter: the \mówi do powłoki po prostu wyjścieEnter jako literral charakteru zamiast interpretowania go jak zwykle (Dlatego shell „przechodzi do następnego wiersza” zamiast zakończenia bieżącego wiersza poleceń i interpretacji, chyba że są w niektórych. inne konstrukty, takie jak heredoc, pętla for itp.).

W związku z tym terminal interpretuje \Enterjako: „przejdź do następnego wiersza” (bez rozpoczynania interpretacji polecenia), a zatem terminal pozwala teraz wprowadzić drugi wiersz polecenia wieloliniowego, a aby był bardziej widoczny, wyświetla $PS2treść ( nazywany monitem PS2 ) w każdej kolejnej linii.

PS2 zmienna jest zazwyczaj definiowane domyślnie jako: PS2="> "a można reprezentują np zmieniać swoich ~ / .bashrc przedefiniować go jak chcesz (biorąc pod uwagę, że to powinno imo, unikać zawierające niebezpieczne znaki, takie jak >czy ;i powinien pomóc albo wyraźnie widać, że jest to multilinii polecenia ale wyłączenie to multilinii treści (np PS2="#cont#") lub pozwala łatwo skopiować / wkleić je z jak najmniejszym wpływie na swoich liniach jak to możliwe (ex: PS2=" ")

Co, nawiasem mówiąc, jest imo złym domyślnym, ponieważ może bardzo dobrze doprowadzić do usunięcia niektórych ważnych poleceń binarnych w niektórych przypadkach.

Możesz zmienić definicję PS2, aby była czymś innym (lubię: PS2 = "", na przykład), aby polecenia wielowierszowe można było łatwo kopiować / wklejać bez obawy:

Na przykład załóżmy, że masz polecenie, które zaczyna być dość długie (i może spasować na ekranie, jeśli twój terminal nie jest wystarczająco szeroki):

grep -i "something"  /some/file  /another/file /3rd/file /etc/someimportantfile 

Jeśli polecenie wygląda na zbyt długie (i zawija się), możesz podzielić je wizualnie na 2 linie, wybierając gdzie (kiedy) chcesz przejść do następnej linii, wstawiając: \Enterw odpowiednim miejscu:

grep -i "something"  /some/file  /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !

Używając domyślnego PS2, powłoka dodała „>” przed „/ etc / someimportantfile” .. więc jeśli skopiujesz / wkleisz te 2 linie w innym terminalu, ich działanie będzie zupełnie inne: zamiast grepowania do 4 plików, grep jest tylko przechodzenie do pierwszych 3 plików, a wyjście grep zastępuje zawartość czwartego pliku (/ etc / someimportantfile)!

Aby uniknąć tych problemów (i wielu innych): możesz na przykład zdefiniować: PS2=" "aby polecenia wieloliniowe były czystsze i łatwiejsze do kopiowania / wklejania:

grep -i "something"  /some/file  /another/file /3rd/file \
  /etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!

Zwróć uwagę, że tym razem / bin / somecommand po prostu przesuwa o 2 spacje w prawo i nie wstawiono żadnego „>”, dzięki czemu możesz bezpiecznie skopiować / wkleić to 2-liniowe polecenie.

PS2 jest również używany w pętlach „for” „while” itp., A zdefiniowanie go jako „” jest dla mnie także lepsze w tych.

Olivier Dulac
źródło