Bash: come sapere se l'output dell'ultimo comando termina con una nuova riga o no?


10

Il più delle volte l'output di un comando termina con il carattere di nuova riga. Ma a volte no, quindi il prompt della shell successivo viene stampato sulla stessa riga insieme all'output.

Esempio:

root @ hostname [~] # echo -n ciao
helloroot @ hostname [~] #

L'ho sempre trovato molto fastidioso.
Ora, potrei semplicemente aggiungere un "\ n" all'inizio della variabile PS1, ma la maggior parte delle volte stamperà una riga aggiuntiva che non mi serve.

È possibile sapere se l'output dell'ultimo comando è terminato con una nuova riga o no?


Soluzione:
(grazie a Dennis)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

Questo dovrebbe essere spostato su superutente.
ℝaphink,

Mi piace la tua versione! Hai usato $()in un posto e backtick in un altro. Puoi usarli $()in entrambi.
In pausa fino a ulteriore avviso.

Lo so. Ma per me è più facile leggere in questo modo
GetFree il

Non lo userei tput colsperché genera comunque solo il valore della variabile COLUMNS, ed è più lento perché non è incorporato nella shell. Ti consigliamo anche di includere \e[K(equivalente a tput el) per eliminare lo spazio bianco inserito in modo da non ottenere un sacco di spazio bianco finale quando si copia e incolla nel caso predefinito. Infine, devi racchiudere tutta questa magia tra \[e \]altrimenti bash proverà a indovinare la posizione del tuo cursore e si incasinerà quando modifichi il tuo comando / cronologia.
dlitz,

1
Il tutto può essere fatto semplicemente:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Risposte:


6

Ho sperimentato quanto segue per emulare la funzione da zshin Bash:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

Emette un segno di percentuale del video inverso, seguito da un mucchio di spazi per farlo avvolgere alla riga successiva, quindi un ritorno a capo, seguito da un segno di dollaro e uno spazio. È possibile aggiungere escape di prompt dopo "\ 015" per personalizzare il prompt.

L'uso di questo dipende da come il terminale gestisce il corretto avvolgimento della linea di margine (margini automatici). La lunghezza di PROMPT_SP è arbitraria, ma dovrebbe essere almeno 80 o qualunque sia la tua normale larghezza del terminale. Potrebbe essere necessario codificare quel valore se $ COLUMNS non è ancora impostato prima che il forciclo venga eseguito ~/.bashrc. Potrebbe essere utile shopt -s checkwinsizese non è già impostato.


Mi chiedo perché qualcuno abbia annullato il voto per ogni risposta . Hmmm ... nessuna spiegazione. Che utile.
In pausa fino a ulteriore avviso.

Ecco un altro modo, senza usare un loop, per creare la stringa pad:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
Pausa fino a ulteriore avviso.

Che cos'è un "segno di percentuale del video inverso"? La parola "video" mi ha confuso e non sono stato in grado di trovare la risposta su Google.
davidchambers,

1
@davidchambers: lo sfondo del personaggio viene visualizzato con il colore di primo piano e il personaggio stesso viene visualizzato con il colore di sfondo. Vedere man 5 terminfoe cercare "video inverso" per visualizzare alcuni documenti che utilizzano questa terminologia.
In pausa fino a ulteriore avviso.

0

No non è possibile. Bash stesso non elabora o vede l'output del programma che ha avviato.

Mi è appena venuto in mente che potrebbe essere possibile scrivere un programma su cui impostare PROMPT_COMMAND, che verificherebbe la posizione corrente del cursore ed emettere una nuova riga se il cursore non si trovasse sul bordo sinistro.


Buona idea. L'unico problema è ... è possibile conoscere la posizione del cursore?
GetFree il

0

zshcerca di risolvere il tuo problema. Se l'ultimo output termina senza una nuova riga, otterrai:

$ echo -n 'abc'
abc%
$ 

Dove %usa lo sfondo / primo piano invertiti. Non sono sicuro che sia portatile bashin alcun modo.

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.