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.


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.


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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.