Come sopprimere i messaggi di errore da cp?


13

Sto attualmente cercando dei modi per sopprimere il comando di errore in Linux, in particolare il comando cp.

Lo voglio:

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

Come posso eliminare il messaggio di errore che viene stampato sullo schermo? Vale a dire, non voglio vedere questo messaggio di errore sul mio monitor.


1
solo FYI, il modo migliore per verificare la presenza di errori è codici di uscita. Il piping da STDERR a / dev / null è standard e eliminerà qualsiasi indicazione visiva di errori, ma il controllo di uno stato di ritorno diverso da zero ti farà sapere se si è verificato un errore o meno, almeno così dovrebbe essere ...
Nathan McCoy,

La tua domanda non è chiara. Vuoi nascondere tutti i messaggi di errore da cp? O vuoi non avere nessun messaggio di errore se il carattere jolly non corrisponde ad alcun file? O qualche altro criterio?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


38

Per sopprimere l'output dell'errore bash, aggiungere 2>/dev/nullalla fine del comando. Questo reindirizza filehandle 2 (STDERR) a /dev/null. Esistono costrutti simili in altre shell, sebbene il costrutto specifico possa variare leggermente.


Mi chiedo perché non ho mai pensato a quella xx
Abdul,

8

Reindirizzare il messaggio di errore (STDERR) a /dev/null:

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

Esempio:

$ 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

La tua domanda non è chiara. La cosa più sensata da fare sarebbe non eseguire cpaffatto quando il carattere jolly non corrisponde a nessun file, piuttosto che eseguire cpe nascondere il messaggio di errore.

Per fare ciò, se la shell è bash, imposta l' nullglobopzione in modo che il modello jolly si espanda a nulla se non corrisponde a nessun file. Quindi controlla se il modello si è espanso in qualcosa e non chiamare cpin quel caso.

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

In parole semplici, verifica se il glob è rimasto invariato, indicando un file inesistente.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi

Questa è la tecnica necessaria se non si desidera che cp generi un errore all'interno di uno script di shell - o almeno, non sono un esperto, ma è quello che sembra funzionare.
NessBird,

0

Aggiungi questo in ~ / .bashrc:

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

poi:

source ~/.bashrc

2
Raccomandare che ciò avvenga in modo permanente mi sembra sciocco. Sembra un'idea molto migliore di appena il tubo stderra /dev/nullquando l'uscita errore è indesiderato. O usando un nome diverso da cp.
HalosGhost

Sono d'accordo con te, ma questa è una soluzione per chi non vuole vedere alcun messaggio di errore sul suo monitor cp.
M122,

-1

è possibile utilizzare:
1 opzione: 2>/dev/null.
2 opzione: 2>&1
Inoltre puoi usarlo alla fine del tuo comando sopprimerà i messaggi di errore:

Esempio qui

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

qui non è possibile recuperare alcuna informazione sul messaggio di errore. Ex2:

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

qui è possibile recuperare alcune informazioni dal seguente file di registro:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.