Bagaimana cara saya menekan pesan kesalahan dari cp?

13

Saat ini saya sedang mencari cara untuk menekan perintah kesalahan di Linux, khususnya, perintah cp.

Saya lakukan:

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

Bagaimana cara saya menekan pesan kesalahan yang dicetak pada layar? Yaitu, saya tidak ingin melihat pesan kesalahan ini di monitor saya.

andy_ttse
sumber
1
hanya FYI, cara terbaik untuk memeriksa kesalahan adalah kode keluar. Perpipaan STDERR ke / dev / null adalah standar dan akan menghilangkan indikasi visual kesalahan, tetapi memeriksa status pengembalian tidak nol akan memberi tahu Anda jika ada kesalahan atau tidak, setidaknya itulah yang seharusnya terjadi. ...
Nathan McCoy
Pertanyaanmu tidak jelas. Apakah Anda ingin menyembunyikan semua pesan kesalahan dari cp? Atau Anda tidak ingin pesan kesalahan jika wildcard tidak cocok dengan file apa pun? Atau kriteria lain?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

38

Untuk menekan output kesalahan bash, tambahkan 2>/dev/nullke akhir perintah Anda. Ini mengarahkan filehandle 2 (STDERR) ke /dev/null. Ada konstruksi serupa di shell lain, meskipun konstruksi spesifik mungkin sedikit berbeda.

John
sumber
Bertanya-tanya mengapa saya tidak pernah memikirkan xx itu
Abdul
8

Alihkan pesan kesalahan (STDERR) ke /dev/null:

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

Contoh:

$ 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
sumber
5

Pertanyaanmu tidak jelas. Hal yang paling masuk akal untuk dilakukan adalah tidak berjalan cpsama sekali ketika wildcard tidak cocok dengan file apa pun, daripada menjalankan cpdan menyembunyikan pesan kesalahan.

Untuk melakukan itu, jika shell adalah bash, atur nullglobopsi sehingga pola wildcard tidak berkembang jika tidak cocok dengan file apa pun. Kemudian periksa apakah polanya meluas ke sesuatu, dan jangan panggil cpdalam hal itu.

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

Di sh polos, uji apakah gumpalan dibiarkan tidak berubah, menunjuk ke file tidak ada.

set -- /srv/ftp/201*/wha*/*.jj
if ! [ -e "$1" ] && ! [ -L "$1" ]; then
  cp "$@" ~
fi
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini adalah teknik yang diperlukan jika Anda tidak ingin cp melemparkan kesalahan dari dalam skrip shell - atau setidaknya, saya bukan ahli, tetapi ini adalah salah satu yang tampaknya berhasil.
NessBird
0

Tambahkan ini di ~ / .bashrc:

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

kemudian:

source ~/.bashrc
M122
sumber
2
Menyarankan agar ini dilakukan secara permanen tampaknya konyol bagi saya. Sepertinya ide yang lebih baik untuk hanya pipa stderrke /dev/nullketika output kesalahan yang tidak diinginkan. Atau menggunakan nama yang berbeda dari cp.
HalosGhost
Saya setuju dengan Anda tetapi ini adalah solusi untuk seseorang yang tidak ingin melihat pesan kesalahan apa pun pada monitornya cp.
M122
-1

Anda dapat menggunakan salah satu:
1 pilihan: 2>/dev/null.
2 pilihan: 2>&1
Selain Anda dapat menggunakan ini di akhir perintah Anda itu akan menekan pesan kesalahan:

Contoh di sini-

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

di sini Anda tidak dapat mengambil info apa pun tentang pesan kesalahan. Ex2:

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

di sini Anda dapat mengambil beberapa info dari file log di bawah ini:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
jeevan kishore
sumber