Cách ẩn đầu ra lệnh trong Bash


99

Tôi muốn làm cho các tập lệnh Bash của mình trở nên thanh lịch hơn cho người dùng cuối. Làm cách nào để ẩn đầu ra khi Bash đang thực hiện các lệnh?

Ví dụ, khi Bash thực thi

yum install nano

Thông tin sau sẽ hiển thị cho người dùng đã thực thi Bash:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

Bây giờ tôi muốn ẩn điều này với người dùng và thay vào đó hiển thị:

    Installing nano ......

Làm thế nào tôi có thể hoàn thành nhiệm vụ này? Tôi chắc chắn sẽ giúp làm cho tập lệnh thân thiện hơn với người dùng. Trong trường hợp xảy ra lỗi thì nó sẽ được hiển thị cho người dùng.

Tôi muốn biết cách hiển thị cùng một thông báo trong khi một nhóm lệnh đang được thực thi.


4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001


Câu trả lời:


246

Dùng cái này.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Giải trình

Để loại bỏ đầu ra khỏi các lệnh, bạn có hai tùy chọn:

  • Đóng tệp bộ mô tả đầu ra, điều này giúp nó không chấp nhận bất kỳ đầu vào nào nữa. Nó trông như thế này:

    your_command "Is anybody listening?" >&-

    Thông thường, đầu ra chuyển đến bộ mô tả tệp 1 (stdout) hoặc 2 (stderr). Nếu bạn đóng một bộ mô tả tệp, bạn sẽ phải làm như vậy cho mọi bộ mô tả được đánh số, vì &>(bên dưới) là một cú pháp BASH đặc biệt không tương thích với >&-:

    /your/first/command >&- 2>&-

    Hãy cẩn thận lưu ý thứ tự: >&- đóng stdout , đó là những gì bạn muốn làm; &>-chuyển hướng stdout và stderr đến một tệp có tên -(gạch nối), đây không phải là những gì bạn muốn làm. Lúc đầu, nó trông giống nhau, nhưng cái sau sẽ tạo ra một tệp lạc trong thư mục làm việc của bạn. Rất dễ nhớ: >&2chuyển hướng stdout đến mô tả 2 (stderr), >&3chuyển hướng stdout đến mô tả 3 và >&-chuyển hướng stdout đến một ngõ cụt (tức là nó đóng stdout).

    Ngoài ra, hãy lưu ý rằng một số lệnh có thể không xử lý đặc biệt tốt bộ mô tả tệp đã đóng ("lỗi ghi: Bộ mô tả tệp không hợp lệ"), đó là lý do tại sao giải pháp tốt hơn có thể là ...

  • Chuyển hướng đầu ra đến/dev/null , chấp nhận tất cả đầu ra và không làm gì với nó. Nó trông như thế này:

    your_command "Hello?" > /dev/null

    Để chuyển hướng đầu ra đến một tệp, bạn có thể hướng cả stdout và stderr đến cùng một nơi rất ngắn gọn, nhưng chỉ trong bash:

    /your/first/command &> /dev/null

Cuối cùng, để thực hiện tương tự cho một số lệnh cùng một lúc, hãy đặt toàn bộ trong dấu ngoặc nhọn. Bash coi đây là một nhóm lệnh , tổng hợp các bộ mô tả tệp đầu ra để bạn có thể chuyển hướng tất cả cùng một lúc. Thay vào đó, nếu bạn quen thuộc với các subhells sử dụng ( command1; command2; )cú pháp, bạn sẽ thấy các dấu ngoặc nhọn hoạt động gần như chính xác theo cùng một cách, ngoại trừ trường hợp bạn đưa chúng vào một đường ống, các dấu ngoặc nhọn sẽ không tạo ra một vỏ con và do đó sẽ cho phép bạn đặt các biến bên trong.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Xem hướng dẫn cơ bản về chuyển hướng để biết thêm chi tiết, tùy chọn và cú pháp.


Xin chào, tôi biết đó là một câu hỏi cũ nhưng có thể thực hiện điều tương tự với điều kiện không? Giống như tôi muốn ẩn đầu ra trong điều kiện nhất định? Tôi biết tôi có thể sao chép cùng một phần trong if-else nhưng có cách nào tốt hơn để làm như vậy không?
Usama Zafar

@UsamaZafar Tôi sẽ làm điều đó bằng cách đặt một biến ( "tham số shell" ), mà bạn đặt thành /dev/nullhoặc /dev/stdout(hoặc /path/to/a/logfile) có điều kiện trước đó trong tập lệnh, sau đó chuyển hướng đến đích đó bằng cách sử dụng &> $output_dest(hoặc bất cứ điều gì bạn đặt tên cho nó). Nếu bạn không muốn kết hợp stdout và stderr trong trường hợp đó, bạn có thể chuyển hướng chúng một cách riêng biệt > $output_dest 2> $errors_dest.
Jeff Bowman

35

Bạn có thể chuyển hướng stdout đến / dev / null.

yum install nano > /dev/null

Hoặc bạn có thể chuyển hướng cả stdout và stderr,

yum install nano &> /dev/null.

Nhưng nếu chương trình có tùy chọn yên tĩnh, điều đó thậm chí còn tốt hơn.


23

Một tiến trình thường có hai đầu ra để sàng lọc: stdout (chuẩn ra) và stderr (lỗi chuẩn).

Thông thường các tin nhắn thông tin được chuyển đến sdout, và các lỗi và cảnh báo được chuyển đến stderr.

Bạn có thể tắt stdoutcho một lệnh bằng cách thực hiện

MyCommand >/dev/null

và tắt stderrbằng cách thực hiện:

MyCommand 2>/dev/null

Nếu bạn muốn cả hai tắt , bạn có thể làm:

MyCommand 2>&1 >/dev/null

Các 2>&1nói gửi stderr đến cùng một vị trí như stdout.


8

Bạn có thể chuyển hướng đầu ra tới /dev/null. Để biết thêm thông tin về / dev / null, hãy đọc liên kết này .

Bạn có thể ẩn đầu ra của comand theo những cách sau:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Chuyển hướng đầu ra tiêu chuẩn thành /dev/null, nhưng không phải lỗi tiêu chuẩn. Điều này sẽ hiển thị các lỗi xảy ra trong quá trình cài đặt, chẳng hạn như nếu yumkhông thể tìm thấy một gói.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Trong khi mã này sẽ không hiển thị bất kỳ thứ gì trong thiết bị đầu cuối vì cả lỗi chuẩn và đầu ra chuẩn đều được chuyển hướng và do đó bị vô hiệu hóa thành /dev/null.


1
Lớn cổ phiếu .... anh chàng bạn có thể chỉ cho tôi làm thế nào để đầu ra cùng một thông điệp duy nhất một lần cho một tập các lệnh
user2650277

5

>/dev/null 2>&1sẽ tắt tiếng cả stdoutstderr

yum install nano >/dev/null 2>&1

4

Bạn không nên sử dụng bash trong trường hợp này để loại bỏ đầu ra. Yum có một lựa chọn-q chặn đầu ra.

Chắc chắn bạn cũng sẽ muốn sử dụng -y

echo "Installing nano..."
yum -y -q install nano

Để xem tất cả các tùy chọn cho yum, hãy sử dụng man yum.


Cảm ơn, tôi giả sử bạn đã có một cái kể từ khi apt-get sử dụng -qq cũng như để ngăn chặn. Điều này rất hữu ích cho những gì tôi đang làm.
Hyperion

0
.SILENT:

Nhập ".SILENT:" vào đầu tập lệnh của bạn mà không có dấu hai chấm.

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.