Inserisci il testo nel buffer della riga di comando bash


9

Vorrei mettere programmaticamente un certo pezzo di testo nel buffer della riga di comando di bash, letto per essere modificato e usato come comando.

Quello che non vedo l'ora è qualcosa di simile a read -ima per i comandi.

-i text Se readline viene utilizzato per leggere la riga, il testo viene inserito nel buffer di modifica prima dell'inizio della modifica.

Modifica : Con programmaticamente intendo che voglio scrivere questo in uno script , avviare lo script e preparare il buffer dei comandi o modificare la cronologia dei comandi (come alcune domande hanno suggerito).


IIRC screenpuò farlo per te.
strugee,

Risposte:


6

Ho trovato un modo bizzarro di farlo nella pagina degli esempi di FZF . Funziona con bash 4.3 e perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Stampa il comando su stdout, ma lo copia anche sul buffer dei comandi. C'è anche un esempio sulla pagina collegata se si desidera eseguire direttamente il comando.


Questa risposta è la più vicina a ciò che è stato richiesto dall'OP.
reza.safiyat,

La sintassi leggermente diversa in questa risposta , &TIOCSTIè un po 'più bella di 0x5412così. Vale la pena notare che alcune piattaforme (ad esempio OpenBSD ) disabilitano TIOCSTI. Penso che ciò significhi che sia questo approccio che zsh print -znon funzionerebbero.
dimo414

4

Se questo per una funzione che utilizzerai in un'associazione readline con bind -x, puoi modificarla READLINE_LINE. ( Esempio )

Al di fuori di un'associazione readline, puoi inserire un falso comando nella cronologia con history -s.


Il problema è che se lo faccio history -s 'foo'in uno script, la storia della shell lanciata non viene modificata affatto
gioele

@gioele Devi avviarlo dalla shell (ad es. da uno script con cui carichi source). Non puoi fare nulla da un processo separato.
Gilles 'SO- smetti di essere malvagio' il

2

La risposta di Gilles è corretta, ma non del tutto soddisfacente. Mentre leggo questa domanda, l'OP vuole "preconfigurare" la riga di input successiva. Nel mio caso, volevo leggere la posizione corrente del terminale nella mia funzione PROMPT_COMMAND. Funziona ma usa lo stesso buffer di lettura della shell primaria, e quindi qualsiasi input dell'utente viene scartato dal fatto che ho fatto una chiamata incorporata "read" nella funzione. Quindi volevo leggere l'input dell'utente separatamente, leggere il mio terminale e quindi reinserire l'input di lettura nel buffer di input, che è la domanda originale. Si noti che questo è effettivamente all'interno dello stesso processo, quindi teoricamente dovrebbe essere possibile.

Per quanto posso vedere (sulla mia base 4.2) non c'è alcuna funzione per spingere qualcosa nello stack di input a livello di codice. In zsh si sta usando 'print -z'.

Quindi la risposta è: questo non è possibile in bash, è necessario utilizzare zsh per questo.


0

In alternativa da history -s 'foo'provare:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
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.