chuyển hướng đến / dev / null


144

Tôi đang đọc một tập lệnh bash shell ví dụ:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

Tôi đang cố gắng hiểu cách sử dụng "/ dev / null 2> & 1" tại đây. Lúc đầu, tôi nghĩ tập lệnh này sử dụng / dev / null để bỏ qua các lỗi một cách duyên dáng, mà không khiến tập lệnh bị sập (giống như thử xử lý ngoại lệ trong các ngôn ngữ lập trình). Bởi vì tôi không thấy cách sử dụng tar để nén thư mục vào tệp tar có thể gây ra bất kỳ loại lỗi nào.


3
Chuyển hướng để /dev/nullkhông ngăn chặn sự cố, nhưng sẽ dọn sạch các luồng đầu ra tiêu chuẩn và thiết bị xuất chuẩn. tarcó thể gây ra lỗi theo nhiều cách khác nhau. Bạn có thể không có quyền ghi, tệp có thể đã tồn tại, v.v.
Sparhawk

3
Chỉ là một mẹo để tránh đầu ra không cần thiết. Về lý do tại sao tar có thể gây ra lỗi: vì thư mục đích không tồn tại, vì nguồn không có, vì bạn không có quyền truy cập ghi vào mục tiêu hoặc đọc vào nguồn, vì tarkhông nằm trong $ PATH của bạn, bởi vì tarbị lỗi (bạn không bao giờ biết), vì không còn chỗ trống trên thiết bị, vì tarphiên bản đã thay đổi và hiện yêu cầu cú pháp khác nhau, vì đĩa gây ra lỗi I / O. Tôi chắc rằng bạn có thể tìm thấy nhiều hơn.
terdon

Câu trả lời:


223

Không, điều này sẽ không ngăn kịch bản bị sập. Nếu có bất kỳ lỗi nào xảy ra trong tarquy trình (ví dụ: quyền bị từ chối, không có tệp hoặc thư mục nào như vậy, ...) tập lệnh sẽ vẫn bị sập.

Bởi vì việc sử dụng > /dev/null 2>&1sẽ chuyển hướng tất cả đầu ra lệnh của bạn (cả stdoutstderr) /dev/null, có nghĩa là không có đầu ra nào được in đến thiết bị đầu cuối.

Theo mặc định:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

Trong tập lệnh, bạn sử dụng > /dev/nullgây ra:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

Và sau đó 2>&1gây ra:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
Theo hiểu biết > /dev/null 2>&1, lệnh này dẫn đến stderr ==> stdout, vì vậy stderr vẫn được in ra thiết bị xuất chuẩn ??
Weishi Zeng

11
có lẽ không quá quan trọng, nhưng là fdgì?
kev


7
Tại sao: CMD > /dev/null 2>&1làm việc nhưng CMD 2>&1 > /dev/nullvẫn cho tôi STDERR?
dbmikus

3
Khuyến nghị: Sử dụng 2>& 1trong các ví dụ mã để nhấn mạnh rằng số và ký hiệu được coi là một phần của toán tử chuyển hướng. Thông thường việc chuyển hướng đến một tệp có khoảng cách giữa >/path/to/file, chuyển hướng đến một mô tả tệp về cơ bản là giống nhau.
Henk Langeveld

21

Tôi đang cố gắng hiểu cách sử dụng "> / dev / null 2> & 1" tại đây.

(lưu ý rằng tôi đã thêm chuyển hướng trước /dev/nulltrong câu hỏi của bạn.)

Ở trên sẽ chuyển hướng STDOUTSTDERRđến /dev/null. Nó hoạt động bằng cách hợp nhất STDERRvào STDOUT. (Về cơ bản, tất cả đầu ra từ lệnh sẽ được chuyển hướng đến thiết bị null .)

... mà không làm cho tập lệnh bị sập (giống như thử xử lý ngoại lệ trong các ngôn ngữ lập trình).

Nó không hoàn toàn giống như một try/catchhoặc bất cứ điều gì. Nó chỉ đơn giản là làm im lặng mọi loại đầu ra (bao gồm cả lỗi) khỏi lệnh.

Bởi vì tôi không thấy cách sử dụng tar để nén thư mục vào tệp tar có thể gây ra bất kỳ loại lỗi nào.

Nó có thể dẫn đến lỗi vì một số lý do, bao gồm:

  • Không đủ quyền trên (các) tệp bạn đang cố lưu trữ hoặc trên tệp mà bạn đang cố ghi vào
  • Thiếu không gian đĩa để tạo kho lưu trữ

giải thích tốt.
Aditya Gupta

7

Khi bạn chạy CMD> / dev / null 2> & 1

STDOUT chuyển hướng đến / dev / null, và sau đó STDERR chuyển hướng đến ĐỊA CHỈ của STDOUT, đã được đặt thành / dev / null, do đó cả STDOUT và STDERR đều trỏ đến / dev / null

Ngược lại, khi bạn chạy CMD 2> & 1> / dev / null

STDERR chuyển hướng đến ĐỊA CHỈ của STDOUT (Mô tả tệp 1 trong thời điểm đó, hoặc / Proc / self / fd / 1), và sau đó STDOUT chuyển hướng đến / dev / null, nhưng STDERR tiếp tục chuyển hướng đến fd1 !! Kết quả là đầu ra bình thường từ STDOUT bị loại bỏ, nhưng các lỗi đến từ STDERR vẫn đang được ghi lên bàn điều khiển.


-2

Chuyển hướng Bash I / O

Ý tưởng chính để làm sáng tỏ mọi thứ là:

Các chuyển hướng được áp dụng từ PHẢI sang TRÁI, ngược lại với cách người nói tiếng Anh thường đọc.


Mã này:

command > filename 2>&1

chuyển hướng stderrđến stdout đầu tiên ( 2>&1) và sau đó gửi stdout(bao gồm cả chuyển hướng stderr) đến filename( > filename). Dưới đây là lời giải thích của ABSG (Chương 20) .

Mã này:

command >>/dev/null 2>&1

chuyển hướng stderrstdoutđến /dev/null... có nghĩa là hư không . Những thứ được gửi đến /dev/nullkhông được lưu, lưu trữ hoặc ghi nhớ theo bất kỳ cách nào.

Họ chỉ được gửi đến ' hư không ' và bị lãng quên. Đây là một cách để chạy các chương trình và đảm bảo rằng chúng tạo ra đầu ra KHÔNG và sẽ không bao giờ được nhìn thấy trên dòng lệnh hoặc trong một tệp nhật ký.


Tôi thấy loại câu hỏi này khá nhiều ... chủ yếu là vì tôi đã phải tự tìm kiếm nó vì tôi đã không được viết mã trong nhiều năm. Dưới đây là một số thông tin hữu ích từ ABSG:

"Chuyển hướng đơn giản có nghĩa là nắm bắt đầu ra từ một tệp, lệnh, chương trình hoặc tập lệnh và gửi nó làm đầu vào cho tệp, lệnh, chương trình hoặc tập lệnh khác."

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG: Advanced Bash Scripting Guide: Các liên kết Chương 20 trên là một liên kết đến trang chuyển hướng I / O của mã nguồn mở tldp.org tài liệu gọi là nâng cao Bash Scripting Guide bởi Mendel Cooper. Nó được liệt kê là "Một cuộc thăm dò chuyên sâu về nghệ thuật viết kịch bản shell" và tôi hoàn toàn đồng ý. Đó là một nguồn tài nguyên tuyệt vời và có vô số câu trả lời cho tất cả các tình huống điên rồ.

Các tài nguyên có giá trị khác: Có nhiều tài nguyên có giá trị trong phần hiện tại / được duy trì (ở một số định dạng tiện dụng như html, pdf, văn bản, v.v.) trên trang Hướng dẫn Dự án Tài liệu Linux . Dưới đây là một vài điều tôi thấy hữu ích:


1
Không, chuyển hướng được xử lý từ trái sang phải. Trong ví dụ của bạn, đầu ra tiêu chuẩn được chuyển hướng đến filename, sau đó lỗi tiêu chuẩn được chuyển hướng đến bất cứ nơi nào đầu ra tiêu chuẩn hiện đang diễn ra (đến filename). Nếu đó là cách ngược lại, lỗi tiêu chuẩn sẽ kết thúc trên thiết bị đầu cuối trong khi chỉ có đầu ra tiêu chuẩn được chuyển hướng đến filename. Ngoài ra, trong command >file1 2>file2, file2sẽ không được tạo nếu file1không thể được tạo (bất kể là file1file2thực sự là các tên đường dẫn hoàn toàn khác nhau).
Kusalananda
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.