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.


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ć.


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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.