Cosa ottengo:
host:~ user$ cat example.txt
some texthost:~ stas$
Cosa voglio ottenere:
host:~ user$ cat example.txt
some text
host:~ stas$
C'è un modo in cui posso cat
comportarmi in questo modo?
Sto usando bash su Mac OS X.
Cosa ottengo:
host:~ user$ cat example.txt
some texthost:~ stas$
Cosa voglio ottenere:
host:~ user$ cat example.txt
some text
host:~ stas$
C'è un modo in cui posso cat
comportarmi in questo modo?
Sto usando bash su Mac OS X.
Risposte:
La maggior parte degli strumenti unix sono progettati per funzionare bene con file di testo. Un file di testo è costituito da una sequenza di righe. Una linea è composta da una sequenza di caratteri stampabili che termina con un carattere di nuova riga. In particolare, l'ultimo carattere di un file di testo non vuoto è sempre un carattere di nuova riga. Evidentemente, example.txt
contiene solo some text
senza una nuova riga finale, quindi non è un file di testo.
cat
fa un lavoro semplice; trasformare file arbitrari in file di testo non fa parte di quel lavoro. Alcuni altri strumenti trasformano sempre il loro input in file di testo; se non sei sicuro che il file che stai visualizzando termina con una nuova riga, prova a eseguire awk 1
invece di cat
.
Puoi fare in modo che bash visualizzi il suo prompt sulla riga successiva se il comando precedente ha lasciato il cursore in un punto diverso dall'ultimo margine. Inserisci questo nella tua .bashrc
(variante di GetFree di una proposta di Dennis Williamson ):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
e, se non è 0, usare una newline ( \n
) come primo carattere di PS1
.
Preferisco il seguente metodo ...
cat example.txt ; echo
Questo non valuta i contenuti di example.txt
o aggiunge occasionalmente una nuova riga. Fa eco a una nuova riga una volta che il gatto è finito, è facile da ricordare e nessuno sta pensando se stanno usando correttamente le citazioni forti o deboli.
L'unico aspetto negativo, in realtà, è che otterrai una nuova riga aggiuntiva se il file ha una nuova riga finale.
Ho iniziato a utilizzare la risposta di @ Gilles, ma ho scoperto che se il terminale avesse cambiato il numero di colonne il prompt non sarebbe più stato all'inizio di una riga come previsto. Ciò può accadere per una serie di motivi, tra cui tmux / suddivisioni dello schermo, ridimensionamento manuale di un contenitore GUI, modifiche dei caratteri, ecc.
Quello che volevo davvero era qualcosa che avrebbe aggiunto una nuova riga se il terminale avesse iniziato a stampare il suo prompt in qualcosa di diverso dalla prima colonna. Per fare questo ho dovuto capire come ottenere la colonna corrente, che ho usato questa risposta per ottenere. La configurazione del prompt di lavoro finale è di seguito:
###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
PS1=""
if [ "$(__get_terminal_column)" != 0 ]; then
PS1="\n"
fi
PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}
###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
exec < /dev/tty
local oldstty=$(stty -g)
stty raw -echo min 0
echo -en "\033[6n" > /dev/tty
local pos
IFS=';' read -r -d R -a pos
stty $oldstty
echo "$((${pos[1]} - 1))"
}
# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"
# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"
__get_terminal_column
?
PS1="\n"
ho solo echo
e non ho bisogno di modificare PS1
.
Il problema potrebbe essere che il tuo esempio.txt non ha una nuova riga alla fine del tuo file.
cat
è il lavoro, quindi probabilmente sto cercando una soluzione alternativa.
example.txt
non ha una nuova riga alla fine del file è il punto centrale della domanda.
Se insisti nell'utilizzare cat
, questo funziona per entrambi i tipi di file, con e senza una nuova riga alla fine:
echo "`cat example.txt`"
Puoi trasformarlo in una funzione con un nome a tua scelta (anche cat
) nel tuo .bashrc
:
cat1(){ echo "`/bin/cat $@`";}
puoi anche aggiungere a .bashrc
PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"
per me va bene.
cat
, quindi lo terrò come ultima risorsa per il momento in cui questo problema inizia a disturbarmi di nuovo.