Come posso modificare le righe precedenti in un comando a più righe in Bash?


24

Quando si immette un comando che si estende su più righe in Bash, come posso modificare le righe precedenti? Sono un utente di Linux Mint (Lisa) usando GNOME Terminal.

Ad esempio, diciamo che scrivo:

$ echo "foo bar
> baz
>

E poi quando sto per digitare la terza riga del comando, improvvisamente realizzo che voglio "foo" e "bar" siano su righe separate. Come riposizionerei il cursore tra "pippo" e "barra" in modo da poter premere invio e posizionarli su linee separate?

(Non è facile come potresti pensare. La freccia in su non funziona, nemmeno Ctrl-P. Quindi, per favore, provalo prima di pubblicare! Grazie!)


La risposta accettata dice che non c'è soluzione, ma c'è. Vedi sotto
cdosborn,

Risposte:


16

Questo, sfortunatamente, dipende da bash, non dal terminale. Le tue opzioni sono:

  1. Utilizzare i punti e virgola anziché le nuove righe, anche se anche in questo caso non è possibile spostarsi su una riga dello schermo alla volta, ma è necessario utilizzare i comandi di movimento di caratteri o parole. (Stranamente, zshalmeno ti consente di spostarti all'interno di un comando composto durante la modifica della cronologia, ma non all'interno del comando corrente .) A volte fc(che ti lancia nell'editor con il comando precedente) è il modo più semplice per gestire i comandi composti.

  2. Se stai usando Bash, usa la seguente combinazione di tasti:

    ctrl x e

    Si aprirà il comando su cui stai lavorando utilizzando l'editor di testo. Salva il file ed esci. (Ho trovato il comando sulla presentazione di Shell Hater .) Gli utenti di Zsh hanno questa alternativa .


1
La pagina man di bash spiega come cambiare quale editor viene usato: comando edit-and-execute (C-xC-e) - Invoca un editor sulla riga comandi corrente ed esegue il risultato come comandi shell. Bash tenta di invocare $ VISUAL, $ EDITOR ed emacs come editor, in questo ordine.
Matteo,

C'è una soluzione, senza aprire l'editor.
cdosborn,

Tecnicamente non dipende da bash, ma dalla libreria "readline" che bash usa per ottenere input.
Christian Herenz,

11

La soluzione è non inserire mai un comando fino a quando la linea multipla non è corretta, basta digitare: CtrlvCtrlj quando si desidera passare alla riga successiva. Metabper tornare indietro di una parola.

soluzione

merito alla risposta di @ rici


4

Stranamente, Ctrl+Cè quello che stai cercando.

quando sei acceso

$ echo "foo bar
> baz
>

basta premere Ctrl+C(la riga di comando modificata verrà sospesa) e premere Up(cronologia precedente). Il tuo prompt sarà: (notare l'assenza di>)

$ echo "foo bar
baz

Ora puoi muoverti con Left Rightsalti lineari anche.

C'è solo una stranezza, devi essere sull'ultimo carattere per aggiungere un'altra linea, quindi spostati per modificare le linee esistenti (vai all'inizio Ctrl+A) e premi Enter se è sufficiente o vai a fine ( Ctrl+E) con cui aggiungere altre linee Enter. Un altro svantaggio è che Ctrl+_(annulla) ripristina solo le modifiche dall'ultimaCtrl+C


-2

Copia i comandi e incollali nel blocco note, quindi formattalo da lì. Successivamente è possibile copiare nuovamente i comandi sul terminale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.