2009-03-05 20 views
208

Tôi có tập lệnh bash chạy chương trình có tham số. Chương trình đó xuất ra một số trạng thái (làm điều này, làm điều đó ...). Không có tùy chọn nào cho chương trình này yên lặng. Làm thế nào tôi có thể ngăn chặn các kịch bản hiển thị bất cứ điều gì?Với Bash Scripting, làm thế nào tôi có thể chặn tất cả đầu ra từ một lệnh?

Tôi đang tìm kiếm thứ gì đó giống như cửa sổ "tắt tiếng".

Trả lời

366

Sau đây gửi đầu ra tiêu chuẩn tới thiết bị rỗng (nhóm bit).

và nếu bạn cũng muốn thông báo lỗi sẽ được gửi ở đó, sử dụng một trong (người đầu tiên có thể không hoạt động trong tất cả vỏ):

scriptname &>/dev/null 
scriptname >/dev/null 2>&1 
scriptname >/dev/null 2>/dev/null 

, và nếu bạn muốn ghi lại những thông điệp mà không nhìn thấy chúng, thay thế /dev/null với một tập tin thực tế, chẳng hạn như:

scriptname &>scriptname.out 

Để hoàn chỉnh, hệ điều hành Windows cmd.exe (nơi "nul" là tương đương với "/ dev/null"), đó là:

scriptname >nul 2>nul 
+8

Note rằng '&>' là đặc biệt để bash (và có thể C shells); Vỏ Korn và Bourne yêu cầu 2>/dev/null hoặc 2> & 1 (để gửi stderr đến cùng một vị trí như stdout). Vỏ Korn dường như giải thích '&>' là "chạy các công cụ lên đến & ở chế độ nền, sau đó thực hiện chuyển hướng i/o trên một lệnh trống". –

+2

Lưu ý rằng một số lệnh ghi trực tiếp vào thiết bị đầu cuối thay vì đầu ra/lỗi chuẩn. Để kiểm tra, hãy đặt 'echo foo> $ (tty)' trong một tập lệnh và chạy './test.sh &>/dev/null' - Đầu ra vẫn được in tới thiết bị đầu cuối. Tất nhiên đây không phải là một vấn đề nếu bạn đang viết một kịch bản mà không sử dụng các lệnh như vậy. – l0b0

+1

Tuyệt vời! > nul 2> nul hoạt động cho Cygwin trong Windows! – yang

30

Something như

script > /dev/null 2>&1 

này sẽ ngăn chặn đầu ra tiêu chuẩn đầu ra lỗi, chuyển hướng họ vừa để /dev/null.

+3

Cũng đạt được chỉ với &> nếu bạn muốn lưu một số gõ;) – andynormancx

+1

Mặc dù tôi đang thêm điều này vào lệnh gs (GhostScript) của tôi, nó vẫn in ra **** Cảnh báo: Tệp có dấu %% EOF bị hỏng , hoặc rác sau %% EOF. Lời khuyên nào? – Piero

4

Giống như andynormancx bài sử dụng này: (nếu bạn đang làm việc trong một môi trường Unix)

scriptname > /dev/null 

hoặc bạn có thể sử dụng này: (nếu bạn đang làm việc trong một môi trường Windows)

scriptname > nul 
+1

Bạn thực sự có thể làm tốt hơn trong vỏ Windows. Nếu thay vào đó bạn sử dụng "scriptname> nul" thì bạn thậm chí sẽ không có tệp để xóa, vì "nul" tương đương với Windows/dev/null. – andynormancx

+1

@andynormancx: Đó là điều tôi ghét về bố cục hệ thống tệp của Windows. Nó "dự trữ" tên tập tin như NUL, COM1, LPT1, CON, vv, không có vấn đề gì bạn đang ở trong thư mục (ngay cả khi bạn đang ở trong một hệ thống tập tin có thể có những tên tập tin, như trong mạng chia sẻ). – dreamlax

+0

Tôi không nghĩ rằng tôi đã thực sự sử dụng NUL kể từ DOS 5.x, có một đèn flash đột ngột nhớ khi tôi thấy câu trả lời này;) – andynormancx

7

Hãy thử

: $(yourcommand) 

: là viết tắt của "không làm gì cả".

$() chỉ là lệnh của bạn.

+1

Rất thú vị nhưng có một giới hạn: mã trạng thái trả về luôn luôn là '0' (sự thành công). Hãy xem một ví dụ bằng cách sử dụng lệnh 'false' luôn trả về' 1' (lỗi). Ví dụ '(echo foo | tee file; false) && echo bar' hiển thị' foo'. Sử dụng mẹo của bạn để ngăn chặn đầu ra: '(: $ (echo foo | tee file; false)) && echo bar'. Nhưng nó hiển thị 'bar' có nghĩa là mã trạng thái trả về là' 0' (đây không phải là mã trạng thái trả về từ 'false'). Vui lòng cập nhật câu trả lời của bạn cung cấp giới hạn này. Chúc mừng – olibre

+2

@olibre, điều gì về 'DUMMY = $ (yourcommand)'? Nó không có giới hạn mà bạn đã đề cập. :) – semente

+3

@semente Hoàn hảo: Lệnh 'DUMMY = $ (echo foo | tee file; false) && echo bar' không hiển thị bất kỳ thứ gì.Và lệnh 'DUMMY = $ (echo foo | tee file; true) && echo bar' hiển thị 'bar'. Hãy cho tôi biết nếu bạn cung cấp một câu trả lời để upvote nó ;-) Chúc mừng – olibre

4

Một thay thế có thể phù hợp trong một số tình huống là gán kết quả của một lệnh cho một biến:

$ DUMMY=`grep root /etc/passwd` 
$ echo $? 
0 
$ DUMMY=`grep r00t /etc/passwd` 
$ echo $? 
1 

Từ Bash và phiên dịch commandline POSIX khác không xem xét các bài tập biến như một lệnh, lệnh hiện tại của mã trả về được tôn trọng.

1

Với Bash Scripting, làm thế nào tôi có thể chặn tất cả đầu ra khỏi lệnh?


IMHO, tôi tin rằng bạn có thể đạt đơn giản sử dụng chuyển hướng này, như quan sát thấy trong câu trả lời đầu tiên, và không có gì khác:

/path/to/command &>/dev/null 


Ví dụ này từ The Linux Documentation Project là đáng để đề cập đến:

3.6 Mẫu: stderr và stdout 2 file

Điều này sẽ đặt mọi đầu ra của chương trình vào một tệp. Điều này là phù hợp đôi khi cho các mục cron, nếu bạn muốn một lệnh để vượt qua trong im lặng tuyệt đối.

 rm -f $(find/-name core) &> /dev/null 
1

Trong bạn kịch bản bạn có thể thêm dòng sau vào các dòng mà bạn biết sẽ đưa ra một sản lượng:

some_code 2>>/dev/null 

Hoặc nếu không bạn cũng có thể thử

some_code >>/dev/null 
Các vấn đề liên quan