Làm cách nào để chặn thông báo lỗi từ cp?


13

Tôi hiện đang tìm cách để ngăn chặn lệnh lỗi trong Linux, đặc biệt là lệnh cp.

Tôi làm:

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

Làm cách nào để chặn thông báo lỗi được in trên màn hình? Tức là tôi không muốn thấy thông báo lỗi này trong màn hình của mình.


1
Chỉ cần FYI, cách tốt nhất để kiểm tra lỗi là mã thoát. Đường ống STDERR tới / dev / null là tiêu chuẩn và sẽ loại bỏ bất kỳ dấu hiệu trực quan nào về lỗi, nhưng kiểm tra trạng thái trả về không bằng 0 sẽ cho bạn biết nếu có lỗi hay không, ít nhất đó là cách nó được coi là ...
Nathan McCoy

Câu hỏi của bạn không rõ ràng. Bạn có muốn ẩn tất cả các thông báo lỗi từ cp? Hoặc bạn muốn không có thông báo lỗi nếu ký tự đại diện không khớp với bất kỳ tệp nào? Hoặc một số tiêu chí khác?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


38

Để chặn đầu ra lỗi bash, nối 2>/dev/nullvào cuối lệnh của bạn. Điều này chuyển hướng tập tin 2 (STDERR) đến /dev/null. Có các cấu trúc tương tự trong các shell khác, mặc dù cấu trúc cụ thể có thể thay đổi một chút.


Tự hỏi tại sao tôi không bao giờ nghĩ về xx đó
Abdul

8

Chuyển hướng thông báo lỗi (STDERR) sang /dev/null:

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

Thí dụ:

$ 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

Câu hỏi của bạn không rõ ràng. Điều hợp lý nhất để làm là không chạy hoàn cptoàn khi ký tự đại diện không khớp với bất kỳ tệp nào, thay vì chạy cpvà ẩn thông báo lỗi.

Để làm điều đó, nếu shell bị bash, hãy đặt nullglobtùy chọn sao cho mẫu ký tự đại diện mở rộng thành không có gì nếu nó không khớp với bất kỳ tệp nào. Sau đó kiểm tra xem mô hình có mở rộng thành bất cứ điều gì không và không gọi cptrong trường hợp đó.

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

Trong sh đơn giản, kiểm tra xem toàn cầu có được giữ nguyên không, chỉ vào một tệp không tồn tại.

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

Đây là kỹ thuật cần thiết nếu bạn không muốn cp đưa ra lỗi từ trong tập lệnh shell - hoặc ít nhất, tôi không phải là chuyên gia, nhưng đây là cách có vẻ hiệu quả.
NessBird

0

Thêm phần này vào ~ / .bashrc:

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

sau đó:

source ~/.bashrc

2
Đề nghị rằng điều này được thực hiện vĩnh viễn có vẻ ngớ ngẩn với tôi. Có vẻ như một ý tưởng tốt hơn nhiều để chỉ dẫn stderrđến /dev/nullkhi đầu ra lỗi là không mong muốn. Hoặc sử dụng một tên khác hơn cp.
HalosGhost

Tôi đồng ý với bạn nhưng đây là giải pháp cho người không muốn thấy bất kỳ thông báo lỗi nào trên màn hình của mình cp.
M122

-1

bạn có thể sử dụng một trong hai
tùy chọn : 2>/dev/null.
Tùy chọn 2: 2>&1
Bên cạnh đó bạn có thể sử dụng điều này ở cuối lệnh, nó sẽ chặn các thông báo lỗi:

Ví dụ ở đây-

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

Ở đây bạn không thể lấy bất kỳ thông tin nào về thông báo lỗi. Ex2:

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

Tại đây bạn có thể lấy một số thông tin từ tệp nhật ký bên dưới:

$ cat log.txt
cp: cannot stat `nofile.txt': No such file or directory
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.