Como dizer ao comando “cat” para não ficar ligado quando não houver caminho fornecido?

5

Estou simplesmente tentando obter um script bash | para retornar o conteúdo de um arquivo de texto.

#!/bin/bash
cat $1

o problema é .. quando o caminho para um arquivo não é alimentado para este script bash ... como ele vai se fechar.

porque via linha de comando regular ... se não houver nenhum caminho de arquivo sendo alimentado ao comando cat ... ele não desliga.

quase como se estivesse esperando por algo ..

    
por user72685 20.06.2014 / 19:03

7 respostas

18

Seu comando também tem outro problema, e se o nome do arquivo tiver espaços?

#!/bin/bash
cat "$1"

Sempre cite, a menos que você tenha uma razão convincente para não fazer isso. E cat "" não trava. Em vez disso, ele produziria uma mensagem de erro como "Nenhum arquivo ou diretório".

    
por 20.06.2014 / 19:27
35
#!/bin/bash
if [[ "$#" -ne 1 ]]; then
    echo "Usage: $0 [INPUT FILE]" 1>&2
    exit 1
fi
cat "$1"
    
por 20.06.2014 / 19:27
4

cat ignorará STDIN se você fornecer um nome de arquivo. Conectar STDIN a /dev/null seria uma solução válida nesse contexto.

$ cat test.sh
#!/bin/bash
cat $1 < /dev/null
$ ./test.sh test.sh
#!/bin/bash
cat $1 < /dev/null
$ ./test.sh
$

A falha desta abordagem é que ela retornará 0 se nenhum nome de arquivo for fornecido. Não há maneira de contornar isso. A falha em abrir o arquivo especificado ainda retornará falha.

    
por 21.06.2014 / 08:01
2

Eu diria que o gato é uma ferramenta inadequada aqui e é por isso que você está recebendo esse comportamento indesejado, o gato é projetado para concatenar um conjunto de arquivos e gravar a saída em outro arquivo, é uma peculiaridade da implementação a entrada padrão é stdin e a saída padrão é stdout.

Eu diria que um comando bem mais adequado seria:

#!/bin/bash
cp ${1} /dev/stdout

O diretório dev stdout é originalmente somente Linux, mas antes que eu seja gritado por usar uma construção específica da plataforma bash (o shell explicitamente declarado que eles estão usando) implementa / dev / stdout como um builtin, portanto, é utilizável em qualquer plataforma com bash ou ksh.

cp é um utilitário mais adequado aqui, pois é projetado para copiar o conteúdo de um arquivo para outro e é exatamente o que estamos fazendo aqui, copiando $ 1 para stdout

Este comando também falhará se não houver entrada e funcionar em qualquer sistema com o bash, observe que o usuário escapou corretamente de qualquer nome de arquivo com caracteres estranhos como espaço ou \ n.

    
por 20.06.2014 / 23:27
1

Para exibir o conteúdo do arquivo somente se o arquivo existir:

#!/bin/bash
[ -f "$1" ] && cat "$1"

Este script assume que o primeiro argumento é o arquivo que você deseja cat

    
por 19.09.2016 / 12:04
0

Padrão $1 a /dev/null , se não existir.

(Você pode facilmente descobrir a sintaxe bash para isso)

    
por 21.06.2014 / 06:38
0
: | cat $1

Este seria o menor código que funcionaria. Deve ignorar a ausência de um arquivo silenciosamente.

No entanto, isso é realmente o que você precisa? Concordo com @Vality que você provavelmente não deve usar cat neste contexto.

    
por 22.06.2014 / 13:45