Jak ukryć komunikaty o błędach od CP?

13

Obecnie szukam sposobów na ukrycie polecenia błędu w Linuksie, w szczególności polecenia cp.

Ja robię:

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

Jak ukryć komunikat o błędzie, który jest drukowany na ekranie? Nie chcę widzieć tego komunikatu o błędzie na moim monitorze.

andy_ttse
źródło
1
po prostu FYI, najlepszym sposobem na sprawdzenie błędów są kody wyjścia. Przesyłanie STDERR do / dev / null jest standardem i pozbywa się wszelkich wizualnych wskazań błędów, ale sprawdzanie niezerowego statusu powrotu da ci znać, czy wystąpił błąd, czy nie, przynajmniej tak powinno być ...
Nathan McCoy
Twoje pytanie nie jest jasne. Czy chcesz ukryć wszystkie komunikaty o błędach przed CP? A może chcesz nie wyświetlać komunikatu o błędzie, jeśli symbol wieloznaczny nie pasuje do żadnego pliku? A może jakieś inne kryteria?
Gilles 'SO - przestań być zły'

Odpowiedzi:

38

Aby wyłączyć wyświetlanie błędów bash, dołącz 2>/dev/nullna końcu polecenia. To przekierowuje uchwyt pliku 2 (STDERR) do /dev/null. Istnieją podobne konstrukcje w innych powłokach, chociaż konkretna konstrukcja może się nieznacznie różnić.

Jan
źródło
Zastanawiam się, dlaczego nigdy nie myślałem o tym xx
Abdul,
8

Przekieruj komunikat o błędzie (STDERR) do /dev/null:

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

Przykład:

$ 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
źródło
5

Twoje pytanie nie jest jasne. Najrozsądniejszym rozwiązaniem byłoby wcale nie uruchamiać cpsię, gdy symbol wieloznaczny nie pasuje do żadnego pliku, zamiast uruchamiać cpi ukrywać komunikat o błędzie.

Aby to zrobić, jeśli powłoka jest bash, ustaw tę nullglobopcję, aby wzorzec wieloznaczny rozwinął się do zera, jeśli nie pasuje do żadnego pliku. Następnie sprawdź, czy wzorzec rozwinął się do czegokolwiek i nie wywołuj cpw tym przypadku.

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

Zwykle sprawdź, czy glob nie został zmieniony, wskazując na nieistniejący plik.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Gilles „SO- przestań być zły”
źródło
Jest to technika niezbędna, jeśli nie chcesz, aby cp wyrzucał błąd ze skryptu powłoki - a przynajmniej nie jestem ekspertem, ale wydaje się, że to działa.
NessBird
0

Dodaj to w ~ / .bashrc:

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

następnie:

source ~/.bashrc
M122
źródło
2
Wydaje mi się głupie zalecanie, by zrobiono to na stałe. Wydaje się, że o wiele lepszy pomysł, aby rury tylko stderrdo /dev/nullkiedy wyjście błędu jest niepożądany. Lub używając innej nazwy niż cp.
HalosGhost
Zgadzam się z tobą, ale jest to rozwiązanie dla kogoś, kto nie chce widzieć żadnych komunikatów o błędach na swoim monitorze cp.
M122
-1

można użyć:
1 opcję: 2>/dev/null.
2 opcja: 2>&1
Poza tym możesz użyć tego na końcu polecenia, spowoduje to usunięcie komunikatów o błędach:

Przykład tutaj-

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

tutaj nie można pobrać żadnych informacji o komunikacie o błędzie. Ex2:

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

tutaj możesz pobrać informacje z poniższego pliku dziennika:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
jeevan kishore
źródło