Как я подавляю сообщения об ошибках от cp?

13

В настоящее время я ищу способы подавления ошибок команды в Linux, в частности, команды cp.

Я делаю:

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

Как подавить сообщение об ошибке , которое получает распечатанный на экране? Т.е. я не хочу видеть это сообщение об ошибке на моем мониторе.

andy_ttse
источник
1
просто к сведению, лучший способ проверить ошибки - коды выхода. Пропускание STDERR в / dev / null является стандартным и избавит от любой визуальной индикации ошибок, но проверка ненулевого статуса возврата даст вам знать, была ли ошибка или нет, по крайней мере, так, как это должно быть ...
Натан Маккой
Ваш вопрос не ясен. Вы хотите скрыть все сообщения об ошибках от cp? Или вы хотите, чтобы сообщение об ошибке не отображалось, если подстановочный знак не соответствует ни одному файлу? Или какие-то другие критерии?
Жиль "ТАК - перестань быть злым"

Ответы:

38

Чтобы подавить вывод ошибок в bash, добавьте 2>/dev/nullв конец вашей команды. Это перенаправляет файловый дескриптор 2 (STDERR) на /dev/null. Есть аналогичные конструкции в других оболочках, хотя конкретная конструкция может незначительно отличаться.

Джон
источник
Интересно, почему я никогда не думал об этом хх
Абдул
8

Перенаправить сообщение об ошибке (STDERR) на /dev/null:

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

Пример:

$ 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
источник
5

Ваш вопрос не ясен. Наиболее разумным было бы вообще не запускаться, cpкогда подстановочный знак не соответствует ни одному файлу, а не запускать cpи скрывать сообщение об ошибке.

Для этого, если оболочкой является bash, установите этот nullglobпараметр так, чтобы шаблон подстановки расширялся до нуля, если он не соответствует ни одному файлу. Затем проверьте, расширился ли шаблон до чего-либо, и не вызывайте cpв этом случае.

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

В простом sh проверьте, был ли оставлен глобус без изменений, указывая на несуществующий файл.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Жиль "ТАК - перестань быть злым"
источник
Эта техника необходима, если вы не хотите, чтобы cp выдавал ошибку из скрипта оболочки - или, по крайней мере, я не эксперт, но похоже, что это работает.
NessBird
0

Добавьте это в ~ / .bashrc:

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

тогда:

source ~/.bashrc
M122
источник
2
Рекомендовать делать это навсегда мне кажется глупым. Похоже , что гораздо лучшее представление о том , чтобы просто труба stderrк /dev/nullкогда выходная ошибка является нежелательным. Или используя другое имя, чем cp.
HalosGhost
Я согласен с вами, но это решение для тех, кто не хочет видеть никаких сообщений об ошибках на своем мониторе cp.
M122
-1

Вы можете использовать либо:
вариант 1: 2>/dev/null.
2 вариант: 2>&1
кроме того, вы можете использовать это в конце вашей команды, она будет подавлять сообщения об ошибках:

Пример здесь

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

здесь вы не можете получить информацию о сообщении об ошибке. Ex2:

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

здесь вы можете получить некоторую информацию из файла журнала ниже:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
Дживан Кишоре
источник