Como fazer o bash colocar o prompt em uma nova linha após o comando cat?

17

O que eu recebo:

host:~ user$ cat example.txt
some texthost:~ stas$

O que eu quero receber:

host:~ user$ cat example.txt
some text
host:~ stas$

Existe alguma maneira que eu possa fazer com que cat se comporte assim?

Estou usando o bash no Mac OS X.

    
por Stanislav Shabalin 06.01.2013 / 20:58

5 respostas

14

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 terminam 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, por isso 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 está sendo exibido termina com uma nova linha, tente executar awk 1 em vez de cat .

Você pode fazer com que o bash exiba seu prompt na próxima linha se o comando anterior tiver deixado o cursor em algum lugar diferente da última margem. Coloque isso no seu .bashrc (variação por GetFree de uma proposta por Dennis Williamson ):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
    
por 06.01.2013 / 22:05
9

Eu prefiro o seguinte método ...

cat example.txt ; echo

Isso não avalia o conteúdo de example.txt ou ocasionalmente adiciona uma nova linha. Apenas ecoa uma nova linha, uma vez que o gato esteja pronto, é fácil de lembrar, e ninguém está pensando se está usando citações strongs ou fracas corretamente.

A única desvantagem, na verdade, é que você obterá uma nova linha extra se o arquivo tiver sua própria nova linha.

    
por 05.10.2014 / 04:36
7

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 divisões de tela / tmux, redimensionamento manual de um contêiner de 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, precisei 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 https://stackoverflow.com/a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "3[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"
    
por 25.08.2014 / 23:42
4

O problema com isso pode ser que o seu exemplo.txt não tenha uma nova linha no final do seu arquivo.

    
por 06.01.2013 / 21:04
2

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 (até cat ) no seu .bashrc :

cat1(){ echo "'/bin/cat $@'";}
    
por 06.01.2013 / 23:45