O que eu ganho:
host:~ user$ cat example.txt
some texthost:~ stas$
O que eu quero obter:
host:~ user$ cat example.txt
some text
host:~ stas$
Existe uma maneira que eu possa fazer me cat
comportar assim?
Estou usando o bash no Mac OS X.
O que eu ganho:
host:~ user$ cat example.txt
some texthost:~ stas$
O que eu quero obter:
host:~ user$ cat example.txt
some text
host:~ stas$
Existe uma maneira que eu possa fazer me cat
comportar assim?
Estou usando o bash no Mac OS X.
Respostas:
A maioria das ferramentas unix é projetada para funcionar bem com arquivos de texto. Um arquivo de texto consiste em uma sequência de linhas. Uma linha consiste em uma sequência de caracteres imprimíveis que termina com um caractere de nova linha. Em particular, o último caractere de um arquivo de texto não vazio é sempre um caractere de nova linha. Evidentemente, example.txt
contém apenas some text
sem nova linha final, portanto, não é um arquivo de texto.
cat
faz um trabalho simples; transformar arquivos arbitrários em arquivos de texto não faz parte desse trabalho. Algumas outras ferramentas sempre transformam sua entrada em arquivos de texto; se você não tiver certeza de que o arquivo que você está exibindo termina com uma nova linha, tente executar em awk 1
vez de cat
.
Você pode fazer com que o bash exiba seu prompt na próxima linha se o comando anterior deixar o cursor em algum lugar que não seja a última margem. Coloque isso em sua .bashrc
(variação do GetFree de uma proposta de Dennis Williamson ):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
e, se não for 0, usar uma nova linha ( \n
) como o primeiro caractere PS1
.
Eu prefiro o seguinte método ...
cat example.txt ; echo
Isso não avalia o conteúdo example.txt
ou, ocasionalmente, adiciona uma nova linha. É apenas ecoar uma nova linha quando o gato está pronto, é fácil de lembrar, e ninguém está pensando se eles estão usando citações fortes ou fracas corretamente.
A única desvantagem, na verdade, é que você obterá uma nova linha extra se o arquivo tiver sua própria linha final.
Comecei a usar a resposta de @ Gilles, mas descobri que, se o terminal alterasse o número de colunas, o prompt não estaria mais no início de uma linha, como esperado. Isso pode acontecer por vários motivos, incluindo tmux / screen splits, redimensionamento manual de um contêiner da GUI, alterações de fonte etc.
O que eu realmente queria era algo que adicionasse uma nova linha se o terminal começasse a imprimir seu prompt em algo diferente da primeira coluna. Para fazer isso, eu precisava descobrir como obter a coluna atual, que usei esta resposta para obter. A configuração final do prompt de trabalho está abaixo:
###
# 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"
apenas ter echo
e não precisar modificar PS1
.
O problema pode ser que o seu exemplo.txt não tenha uma nova linha no final do seu arquivo.
cat
é o trabalho dele, então provavelmente estou procurando alguma solução alternativa.
example.txt
não ter uma nova linha no final do arquivo, é o ponto principal da questão.
Se você insistir em usar cat
, isso funcionará para os dois tipos de arquivos, com e sem uma nova linha no final:
echo "`cat example.txt`"
Você pode transformá-lo em uma função com um nome de sua escolha (par cat
) em .bashrc
:
cat1(){ echo "`/bin/cat $@`";}
você também pode adicionar ao .bashrc
PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"
funciona para mim.
cat
, por isso vou mantê-lo como último recurso no momento em que esse problema começar a me incomodar novamente.