Comment supprimer les messages d'erreur de cp?

13

Je cherche actuellement des moyens de supprimer la commande d'erreur sous Linux, en particulier la commande cp.

Je fais:

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

Comment supprimer le message d'erreur qui s'imprime à l'écran? C'est-à-dire que je ne veux pas voir ce message d'erreur sur mon moniteur.

andy_ttse
la source
1
juste pour info, la meilleure façon de vérifier les erreurs est les codes de sortie. Le piping STDERR vers / dev / null est standard et supprimera toute indication visuelle d'erreurs, mais la vérification d'un état de retour non nul vous permettra de savoir s'il y a eu une erreur ou non, du moins c'est ainsi que cela est censé être ...
Nathan McCoy
Votre question n'est pas claire. Voulez-vous masquer tous les messages d'erreur de cp? Ou voulez-vous ne pas avoir de message d'erreur si le caractère générique ne correspond à aucun fichier? Ou d'autres critères?
Gilles 'SO- arrête d'être méchant'

Réponses:

38

Pour supprimer la sortie d'erreur dans bash, ajoutez 2>/dev/nullà la fin de votre commande. Cela redirige le descripteur de fichier 2 (STDERR) vers /dev/null. Il existe des constructions similaires dans d'autres coquilles, bien que la construction spécifique puisse varier légèrement.

John
la source
Je me demande pourquoi je n'ai jamais pensé à ça xx
Abdul
8

Redirigez le message d'erreur (STDERR) vers /dev/null:

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

Exemple:

$ 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
heemayl
la source
5

Votre question n'est pas claire. La chose la plus raisonnable à faire serait de ne pas exécuter cpdu tout lorsque le caractère générique ne correspond à aucun fichier, plutôt que d'exécuter cpet de masquer le message d'erreur.

Pour ce faire, si le shell est bash, définissez l' nullgloboption de sorte que le motif générique se développe à rien s'il ne correspond à aucun fichier. Vérifiez ensuite si le motif s'est étendu à quelque chose et n'appelez pas cpdans ce cas.

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

En clair, testez si le glob est resté inchangé, pointant vers un fichier inexistant.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Gilles 'SO- arrête d'être méchant'
la source
C'est la technique nécessaire si vous ne voulez pas que cp lance une erreur depuis un script shell - ou du moins, je ne suis pas un expert, mais c'est celui qui semble fonctionner.
NessBird
0

Ajoutez ceci dans ~ / .bashrc:

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

puis:

source ~/.bashrc
M122
la source
2
Il me semble stupide de recommander que cela soit fait de façon permanente. Il semble comme une bien meilleure idée de conduite juste stderrà /dev/nullquand la sortie d'erreur est indésirable. Ou en utilisant un nom différent de cp.
HalosGhost
Je suis d'accord avec vous mais c'est une solution pour quelqu'un qui ne veut pas voir de messages d'erreur sur son moniteur cp.
M122
-1

vous pouvez utiliser:
1 Option: 2>/dev/null.
Option 2: 2>&1
En plus vous pouvez l'utiliser à la fin de votre commande, cela supprimera les messages d'erreur:

Exemple ici-

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

Ici, vous ne pouvez pas récupérer d'informations sur le message d'erreur. Ex2:

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

ici, vous pouvez récupérer des informations dans le fichier journal ci-dessous:

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