Quando premo la barra rovesciata \, mi viene dato un >
simbolo (maggiore di). Cosa significa questo?
Quando premo la barra rovesciata \, mi viene dato un >
simbolo (maggiore di). Cosa significa questo?
Risposte:
Ogni volta che si utilizza la riga di comando, potrebbe esserci un'istanza in cui è necessario eseguire un comando molto lungo. Quindi, si desidera dividere il comando in più righe per una migliore leggibilità e comprensione. Ma se usi un nuovo carattere di linea che viene digitato da Enter, la shell penserà che si tratta di un nuovo comando. Quindi usi \
seguito dal carattere di nuova riga.
Fondamentalmente, i comandi o gli script bash sono "interpretati", cioè eseguiti riga per riga. Ogni nuova riga indica l'inizio di un nuovo comando. Nel terminale, quando si preme Enter, viene richiesto di eseguire un nuovo comando. Quindi, una nuova linea deve essere "sfuggita". La digitazione \
seguita da Enterconsente di dividere il comando corrente in più righe in modo che la shell non pensi che sia un nuovo comando ma la continuazione del comando precedente.
>
non è altro che un prompt per la riga successiva del comando inserito.
Ad esempio:
se vogliamo installare più pacchetti, il comando sarà simile
$ sudo apt install [package1] [package2] [package3] ...
Ma a volte, questo rende il comando ingombra. Quindi possiamo usare \
seguito da Enter(carattere di nuova riga)
$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
$PS1
e $PS2
. Vedi la pagina man di bash per imparare il formato, e usa echo "'$PS2'"
per visualizzare l'impostazione corrente.
Il carattere barra rovesciata ( \
) viene utilizzato come carattere di escape nella shell. Se lo usi come ultimo carattere sulla riga, sfugge alla nuova riga, in modo da poter continuare il comando sulla riga successiva invece di finirlo. Questo è indicato dal >
prompt in Bash.
Esempio:
$ echo A\
> B
AB
$
Per dare un valore letterale \
al tuo comando, devi scappare usando un'altra barra rovesciata:
$ echo \\
\
$
[aggiungendo una risposta (troppo lunga / complessa) poiché gli altri 2 non menzionano come appare ">" ... cioè, non menzionare PS2]
Hai digitato:: \Enterthe \dice alla shell di generare semplicemente il Entercarattere di carattere mediterraneo invece di interpretarlo come al solito (Pertanto la shell "passa alla riga successiva" invece di terminare la riga di comando corrente e interpretarla. A meno che tu non sia in alcuni altri costrutti come un heredoc, un for loop, ecc.).
Il tuo terminale quindi interpreta \Entercome: "vai alla riga successiva" (senza iniziare a interpretare il comando) e quindi il terminale ora ti consente di inserire la 2a riga di un comando multilinea, e per renderlo più visibile visualizza il $PS2
contenuto ( chiamato prompt PS2 ) su ogni riga successiva.
La variabile PS2 è di solito definita di default come: PS2="> "
e puoi ad esempio modificare il tuo ~ / .bashrc per ridefinirlo come desideri (tenendo presente che dovrebbe, imo, evitare di contenere caratteri pericolosi, come >
o ;
, e dovrebbe aiutarti sia chiaramente vedere che è un comandi multilinea ma disabilita il suo contenuto multilinea (es: PS2="#cont#"
) o lasciare che facilmente copia / incolla di loro con il minor impatto sulle sue linee più possibile (es: PS2=" "
)
Il che, a proposito, è un difetto di default, in quanto potrebbe portare a eliminare alcuni importanti comandi binari in alcuni casi.
Puoi ridefinire PS2 in modo che sia qualcos'altro (mi piace: PS2 = "", ad esempio) in modo che i comandi multilinea possano essere facilmente copiati / incollati senza temere quanto segue:
Ad esempio, supponiamo che tu abbia un comando che inizia a essere piuttosto lungo (e potrebbe piegarsi sullo schermo se il tuo terminale non è abbastanza largo):
grep -i "something" /some/file /another/file /3rd/file /etc/someimportantfile
Se il comando sembra troppo lungo (e si avvolge), potresti voler dividerlo visivamente in 2 righe, scegliendo dove (quando) vuoi la riga successiva inserendo: \Enternel punto appropriato:
grep -i "something" /some/file /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !
Usando la PS2 predefinita, la shell ha aggiunto ">" before "/ etc / someimportantfile" .. quindi se copi / incolli quelle 2 linee in un altro terminale, la loro azione sarà completamente diversa: invece di accedere a 4 file, grep è andando solo nei primi 3 file e l' output grep sostituisce il contenuto del quarto file (/ etc / someimportantfile)!
Per evitare questi problemi (e molti altri): per esempio potresti definire: PS2=" "
per rendere i comandi multilinea più puliti e più facili da copiare / incollare:
grep -i "something" /some/file /another/file /3rd/file \
/etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!
Nota come questo time / bin / somecommand sia semplicemente spostato di 2 spazi a destra e non sia stato inserito nessun ">", così puoi tranquillamente copiare / incollare questo comando a 2 righe.
PS2 è anche usato in "for" "mentre" etc loop, e averlo definito come "" è, per me, migliore anche in quelli.