Wie unterdrücke ich Fehlermeldungen von cp?

13

Ich suche derzeit nach Möglichkeiten, um Fehlerbefehle unter Linux zu unterdrücken, insbesondere den Befehl cp.

Ich mache:

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

Wie unterdrücke ich die Fehlermeldung, die auf dem Bildschirm gedruckt wird ? Das heißt, ich möchte diese Fehlermeldung nicht auf meinem Monitor sehen.

andy_ttse
quelle
1
Nur zu Ihrer Information, der beste Weg, um nach Fehlern zu suchen, sind Exit-Codes. Das Weiterleiten von STDERR an / dev / null ist Standard und beseitigt alle visuellen Fehleranzeigen. Wenn Sie jedoch auf einen Rückgabestatus ungleich Null prüfen, werden Sie darüber informiert, ob ein Fehler aufgetreten ist oder nicht, zumindest sollte dies so sein ...
Nathan McCoy
Ihre Frage ist nicht klar. Möchten Sie alle Fehlermeldungen vor cp verbergen? Oder möchten Sie keine Fehlermeldung erhalten, wenn der Platzhalter nicht mit Dateien übereinstimmt? Oder andere Kriterien?
Gilles 'SO - hör auf böse zu sein'

Antworten:

38

Um die Fehlerausgabe in zu unterdrücken bash, hängen Sie sie 2>/dev/nullan das Ende Ihres Befehls an. Dadurch wird Dateihandle 2 (STDERR) an umgeleitet /dev/null. Es gibt ähnliche Konstrukte in anderen Schalen, obwohl das spezifische Konstrukt geringfügig variieren kann.

John
quelle
Ich frage mich, warum ich nie daran gedacht habe xx
Abdul
8

Leiten Sie die Fehlermeldung (STDERR) um an /dev/null:

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

Beispiel:

$ 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
quelle
4

Ihre Frage ist nicht klar. Am sinnvollsten wäre es, überhaupt nicht auszuführen, cpwenn der Platzhalter keiner Datei entspricht, anstatt cpdie Fehlermeldung auszuführen und auszublenden.

Wenn die Shell bash ist, setzen Sie dazu die nullglobOption so, dass das Platzhaltermuster auf nichts erweitert wird, wenn es nicht mit Dateien übereinstimmt. Überprüfen Sie dann, ob das Muster zu etwas erweitert wurde, und rufen Sie cpin diesem Fall nicht auf.

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

Testen Sie im Klartext, ob der Glob unverändert blieb, und zeigen Sie auf eine nicht vorhandene Datei.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Gilles 'SO - hör auf böse zu sein'
quelle
0

Fügen Sie dies in ~ / .bashrc hinzu:

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

dann:

source ~/.bashrc
M122
quelle
2
Die Empfehlung, dies dauerhaft zu tun, erscheint mir albern. Es scheint eine viel bessere Idee zu sein, nur zu leiten stderr, /dev/nullwenn die Fehlerausgabe unerwünscht ist. Oder mit einem anderen Namen als cp.
HalosGhost
Ich stimme Ihnen zu, aber dies ist eine Lösung für jemanden, der keine Fehlermeldungen auf seinem Monitor sehen möchte cp.
M122
0

Sie können entweder:
1 Option verwenden : 2>/dev/null.
2 Option: 2>&1
Außerdem können Sie dies am Ende Ihres Befehls verwenden, um die Fehlermeldungen zu unterdrücken:

Beispiel hier-

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

Hier können Sie keine Informationen über die Fehlermeldung abrufen. Ex2:

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

Hier können Sie einige Informationen aus der folgenden Protokolldatei abrufen:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
Jeevan Kishore
quelle