ฉันจะระงับข้อความแสดงข้อผิดพลาดจาก cp ได้อย่างไร


13

cpฉันกำลังมองหาวิธีการที่จะสั่งปราบข้อผิดพลาดในลินุกซ์โดยเฉพาะอย่างยิ่งคำสั่ง

ฉันทำ:

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

ฉันจะระงับข้อความแสดงข้อผิดพลาดที่พิมพ์บนหน้าจอได้อย่างไร นั่นคือฉันไม่ต้องการเห็นข้อความแสดงข้อผิดพลาดนี้ในมอนิเตอร์ของฉัน


1
เพียงแค่ FYI วิธีที่ดีที่สุดในการตรวจสอบข้อผิดพลาดคือรหัสออก การส่ง STDERR ไปยัง / dev / null เป็นมาตรฐานและจะกำจัดข้อผิดพลาดใด ๆ ที่มองเห็นได้ แต่การตรวจสอบสถานะการส่งคืนที่ไม่ใช่ศูนย์จะแจ้งให้คุณทราบว่ามีข้อผิดพลาดหรือไม่อย่างน้อยนั่นเป็นวิธีที่ควรจะเป็น ...
Nathan McCoy

คำถามของคุณไม่ชัดเจน คุณต้องการซ่อนข้อความแสดงข้อผิดพลาดทั้งหมดจาก cp หรือไม่ หรือคุณต้องการที่จะไม่มีข้อผิดพลาดถ้าสัญลักษณ์แทนไม่ตรงกับไฟล์ใด ๆ ? หรือเกณฑ์อื่น ๆ ?
Gilles 'ดังนั้นหยุดความชั่วร้าย'

คำตอบ:


38

หากต้องการระงับเอาต์พุตข้อผิดพลาดbashให้ต่อ2>/dev/nullท้ายคำสั่งของคุณ การเปลี่ยนเส้นทางนี้ filehandle 2 (STDERR) /dev/nullเพื่อ มีโครงสร้างที่คล้ายกันในเปลือกหอยอื่น ๆ แม้ว่าโครงสร้างเฉพาะอาจแตกต่างกันเล็กน้อย


สงสัยว่าทำไมฉันไม่เคยคิดถึง xx นั้น
Abdul

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

5

คำถามของคุณไม่ชัดเจน สิ่งที่เหมาะสมที่สุดที่จะทำคือไม่เรียกใช้cpเลยเมื่อ wildcard ไม่ตรงกับไฟล์ใด ๆ แทนที่จะรันcpและซ่อนข้อความแสดงข้อผิดพลาด

หากต้องการทำเช่นนั้นหากเชลล์เป็นทุบตีให้ตั้งค่าnullglobตัวเลือกเพื่อให้รูปแบบไวด์การ์ดขยายเป็นไม่มีอะไรเลยหากเชลล์ไม่ตรงกับไฟล์ใด ๆ จากนั้นตรวจสอบว่ารูปแบบขยายไปยังสิ่งใดหรือไม่และไม่โทรcpในกรณีนั้น

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

ใน sh แบบธรรมดาให้ทดสอบว่า glob ไม่มีการเปลี่ยนแปลงหรือไม่ชี้ไปที่ไฟล์ที่ไม่มีอยู่จริง

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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.