[英]How to hide command output in Bash
我想讓我的 Bash 腳本對最終用戶更優雅。 Bash 執行命令時如何隱藏輸出?
例如,當 Bash 執行時
yum install nano
以下將顯示給執行 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!
現在我想對用戶隱藏它,而是顯示:
Installing nano ......
我怎樣才能完成這項任務? 我一定會幫助使腳本更加用戶友好。 如果發生錯誤,則應將其顯示給用戶。
我想知道在執行一組命令時如何顯示相同的消息。
{
/your/first/command
/your/second/command
} &> /dev/null
要消除命令的輸出,您有兩種選擇:
關閉輸出描述符文件,使其不再接受任何輸入。 看起來像這樣:
your_command "Is anybody listening?" >&-
通常,輸出到文件描述符 1 (stdout) 或 2 (stderr)。 如果關閉文件描述符,則必須對每個編號的描述符都這樣做,因為&>
(如下)是與>&-
不兼容的特殊 BASH 語法:
/your/first/command >&- 2>&-
注意順序: >&-
關閉 stdout ,這是你想要做的; &>-
將 stdout 和 stderr 重定向到名為-
(連字符)的文件,這不是您想要做的。 一開始看起來是一樣的,但后者會在你的工作目錄中創建一個雜散文件。 很容易記住: >&2
將標准輸出重定向到描述符 2(stderr), >&3
將標准輸出重定向到描述符 3,並且>&-
將標准輸出重定向到死胡同(即它關閉標准輸出)。
另請注意,某些命令可能無法特別好地處理關閉的文件描述符(“寫入錯誤:錯誤的文件描述符”),這就是為什么更好的解決方案可能是...
將輸出重定向到/dev/null
,它接受所有輸出並且不做任何事情。 它看起來像這樣:
your_command "Hello?" > /dev/null
對於輸出重定向到文件,您可以非常簡潔地將 stdout 和 stderr 定向到同一個位置,但只能在 bash 中:
/your/first/command &> /dev/null
最后,要同時對多個命令執行相同的操作,請將整個內容用花括號括起來。 Bash 將其視為一組命令,聚合輸出文件描述符,以便您可以一次重定向所有內容。 如果您熟悉使用( command1; command2; )
語法的子shell,您會發現大括號的行為幾乎完全相同,除非您將它們包含在管道中,否則大括號不會創建子shell,因此將允許你在里面設置變量。
{
/your/first/command
/your/second/command
} &> /dev/null
有關更多詳細信息、選項和語法,請參閱bash 重定向手冊。
您可以將標准輸出重定向到 /dev/null。
yum install nano > /dev/null
或者你可以同時重定向標准輸出和標准錯誤,
yum install nano &> /dev/null
。
但如果程序有一個安靜的選項,那就更好了。
一個進程通常有兩個屏幕輸出: stdout (標准輸出)和stderr (標准錯誤)。
通常信息性消息轉到sdout
,錯誤和警報轉到stderr
。
您可以通過執行關閉命令的stdout
MyCommand >/dev/null
並通過執行以下操作關閉stderr
:
MyCommand 2>/dev/null
如果你想兩者都 off ,你可以這樣做:
MyCommand >/dev/null 2>&1
2>&1
表示將 stderr 發送到與 stdout 相同的位置。
您可以將輸出重定向到/dev/null
。 有關 /dev/null 的更多信息,請閱讀此鏈接。
您可以通過以下方式隱藏命令的輸出:
echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done.";
將標准輸出重定向到/dev/null
,而不是標准錯誤。 這將顯示安裝過程中發生的錯誤,例如如果yum
找不到軟件包。
echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";
雖然此代碼不會在終端中顯示任何內容,因為標准錯誤和標准輸出都被重定向並因此無效到/dev/null
。
>/dev/null 2>&1
將靜音stdout
和stderr
yum install nano >/dev/null 2>&1
在這種情況下,您不應該使用 bash 來消除輸出。 Yum 確實有一個選項-q
可以抑制輸出。
你肯定也想使用-y
echo "Installing nano..."
yum -y -q install nano
要查看 yum 的所有選項,請使用man yum
。
.SILENT:
在腳本的開頭鍵入“.SILENT:”,不帶冒號。
您也可以通過將其輸出分配給變量來做到這一點,這在您沒有/dev/null
時特別有用。
是的,我遇到了無法使用/dev/null
的情況。
我找到的解決方案是將輸出分配給一個我永遠不會在那里使用的變量:
hide_output=$([[ -d /proc ]] && [[ mountpoint -q /proc ]] && umount -l /proc)
這個: command > /dev/null
或者這個:(也抑制錯誤) command > /dev/null 2>&1
與許多其他答案類似,但它們對我不起作用,因為2>
在 dev/null 前面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.