Dlaczego czasami pojawia się monit o „>” w terminalu?

19

Dobra, kiedy uruchamiam niektóre polecenia w niewłaściwy sposób (błędnie napisane itp.) Terminal wysyła to: >zamiast computername:workingfolder username$, a kiedy piszę, wpisuje się następująco:

>

>

>

Tak byłoby, gdybym nacisnął klawisz Enter 3 razy.

Wyświetlana nazwa
źródło

Odpowiedzi:

43

> jest domyślnym monitem o kontynuację. To zobaczysz, jeśli to, co wprowadziłeś wcześniej, miało niezrównoważone znaki cudzysłowu.

Jako przykład wpisz pojedynczy cytat w wierszu polecenia, a następnie kilka enterklawiszy:

$ '
> 
> 
> 

Monity o kontynuację będą pojawiać się, dopóki ty też nie

  • (a) uzupełnij polecenie zamykającym znakiem cudzysłowu

    lub

  • (b) wpisz Ctrl+D aby zakończyć wprowadzanie, w którym to momencie powłoka odpowie komunikatem o błędzie dotyczącym niezrównoważonych cytatów,

    lub

  • (c) wpisz Ctrl+, Cktóry przerwie wprowadzane polecenie.

Jak to jest przydatne

Czasami możesz chcieć wprowadzić ciąg zawierający osadzone nowe linie. Możesz to zrobić w następujący sposób:

$ paragraph='first line
> second line
> third line
> end'

Teraz, gdy wyświetlamy tę zmienną powłoki, możesz zobaczyć, że monity zniknęły, ale zachowano nowe linie:

$ echo "$paragraph"
first line
second line
third line
end
John1024
źródło
16

Stanie się tak, jeśli masz niezamknięty cytat w swoim poleceniu. To jest coś takiego:

$ echo "test here
>
>
...

Możesz wyjść z tego trybu, zamykając wycenę (napisz "lub ', lub cokolwiek to jest otwarta wycena). Może to być również blok rozdzielany nawiasami klamrowymi, częściowo kompletny for-dolub while-dozapętlony, lub niektóre inne konstrukty. Możesz także nacisnąć, Ctrl-Caby anulować to polecenie (a następnie nacisnąćUp aby je zmienić).

Czasami może się to zdarzyć bez oczywistego braku cytatu, gdy rozszerzenia parametrów lub historii występują tam, gdzie się ich nie spodziewałeś.


Jest >to twoja PS2(„wtórna zachęta”) wartość. Możesz zmienić to na coś innego, aby przypomnieć Ci, co się stało:

PS2="Unclosed >"

w twoim .bashrcsprawi, że Unclosed >zamiast tego będzie drukowany na początku każdej linii.

Michael Homer
źródło
7

Oprócz innych odpowiedzi pojawia się również monit o kontynuację, gdy wpisujesz \jako ostatni znak w linii.

Pan Lister
źródło
5
(Dla mnie dzieje się to zwykle przez przypadek, ponieważ ukośnik jest przerażająco blisko klawisza Enter.)
Pan Lister
Nie na mojej klawiaturze , tak nie jest.
TRiG
@TRiG Masz na myśli, że często wpisujesz # przez przypadek zamiast \? Racja ...
Pan Lister
7

Odpowiedź leży w tej tajemniczej wzmiance w Podręczniku użytkownika Bash :

5.1 Zmienne powłoki Bourne'a

[...]

  • PS1: Podstawowy ciąg zachęty. Wartość domyślna to „ \s-\v\$”. Zobacz Drukowanie monitu , aby wyświetlić pełną listę sekwencji specjalnych, które zostały wcześniej rozwinięte PS1.
  • PS2: Drugi ciąg zachęty. Wartość domyślna to „ >”.

… A następnie :

6.3.3 Zachowanie interaktywnej powłoki

  1. Bash rozwija się i wyświetla PS1przed odczytem pierwszego wiersza polecenia oraz rozwija i wyświetla PS2przed odczytem drugiego i kolejnych wierszy polecenia wieloliniowego.

Tak więc >monit pojawi się, jeśli naciśniesz, Entera Bash ustali, że polecenie jest niekompletne. Może tak być, ponieważ:

  • Znak przed nową linią to a \, który jest traktowany jako kontynuacja linii .
  • Masz niekompletny String (niedopasowane cytaty lub niezakończony tu-doc) lub jakieś inne niedopasowane separatory, takie jak $(), (),`` .
  • Uruchomiłeś definicję funkcji, forpętlę, whilepętlę lub a case.

Jeśli widzisz dodatkowe pytanie z powodu niezamierzonego błędu pisania, naciśnij, ControlCaby powrócić do podstawowego pytania.

200_sukces
źródło
Drugi monit pojawia się również, gdy piszesz tutaj dokument. Ale jest to mniej prawdopodobne, że stanie się to przez przypadek niż inne.
Barmar
6

Powłoka czeka na wykonanie polecenia. Może gdzieś jest niezamknięty cytat lub wydaje się, że zaczynasz pętlę „za” i czeka, aż użytkownik skończy pisać

SidJ
źródło