Como suprimir mensagens de erro do cp?

13

Atualmente, estou procurando maneiras de suprimir o comando de erro no Linux, em particular, o comando cp.

Eu faço:

root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/.
cp: cannot stat `/srv/ftp/201*/wha*/*.jj': No such file or directory

Como suprimo a mensagem de erro impressa na tela? Ou seja, não quero ver essa mensagem de erro no meu monitor.

andy_ttse
fonte
1
apenas para sua informação, a melhor maneira de verificar se há erros é os códigos de saída. A canalização STDERR para / dev / null é padrão e eliminará qualquer indicação visual de erros, mas a verificação de um status de retorno diferente de zero permitirá que você saiba se houve um erro ou não, pelo menos é assim que deve ser ...
Nathan McCoy
Sua pergunta não está clara. Deseja ocultar todas as mensagens de erro do cp? Ou você deseja não receber uma mensagem de erro se o curinga não corresponder a nenhum arquivo? Ou algum outro critério?
Gilles 'SO- stop be evil'

Respostas:

38

Para suprimir a saída de erro bash, anexe 2>/dev/nullno final do seu comando. Isso redireciona o manipulador de arquivos 2 (STDERR) para /dev/null. Existem construções semelhantes em outras conchas, embora a construção específica possa variar um pouco.

John
fonte
Pergunto-me por que eu nunca pensei nisso xx
Abdul
8

Redirecione a mensagem de erro (STDERR) para /dev/null:

root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/. 2>/dev/null

Exemplo:

$ cp /srv/ftp/201*/wha*/*.jj ~/.  ##Error message gets printed
cp: cannot stat ‘/srv/ftp/201*/wha*/*.jj’: No such file or directory

$ cp /srv/ftp/201*/wha*/*.jj ~/. 2>/dev/null  ##No error message gets printed
heemail
fonte
5

Sua pergunta não está clara. A coisa mais sensata a fazer seria não executar cpquando o curinga não corresponder a nenhum arquivo, em vez de executar cpe ocultar a mensagem de erro.

Para fazer isso, se o shell for bash, defina a nullglobopção para que o padrão curinga se expanda para nada se não corresponder a nenhum arquivo. Em seguida, verifique se o padrão se expandiu para algo e não chame cpnesse caso.

#!/bin/bash
shopt -s nullglob
files=(/srv/ftp/201*/wha*/*.jj)
if [[ ${#files[@]} -ne 0 ]]; then
  cp "${files[@]}" ~
fi

No sh simples, teste se o globo foi deixado inalterado, apontando para um arquivo inexistente.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Gilles 'SO- parar de ser mau'
fonte
Essa é a técnica necessária se você não quiser que o cp gere um erro de dentro de um script de shell - ou pelo menos não sou especialista, mas essa é a que parece funcionar.
NessBird 13/03
0

Adicione isso em ~ / .bashrc:

alias cp='cp 2> /dev/null'

então:

source ~/.bashrc
M122
fonte
2
Recomendar que isso seja feito permanentemente me parece bobagem. Parece uma idéia muito melhor para apenas tubo stderrpara /dev/nullquando a saída de erro é indesejada. Ou usando um nome diferente de cp.
HalosGhost
Concordo com você, mas esta é uma solução para alguém que não deseja ver nenhuma mensagem de erro em seu monitor cp.
M122
-1

você pode usar:
1 opção: 2>/dev/null.
2 opção: 2>&1
Além de você poder usá-lo no final do seu comando, suprimirá as mensagens de erro:

Exemplo aqui-

$cp nofile.txt b.txt > log.txt 2>/dev/null

aqui você não pode recuperar nenhuma informação sobre a mensagem de erro. Ex2:

$cp nofile.txt b.txt > log.txt 2>&1

aqui você pode recuperar algumas informações do arquivo de log abaixo:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
jeevan kishore
fonte