Linux

將 STDOUT 臨時重定向到另一個文件描述符,但仍重定向到螢幕

  • April 16, 2012

我正在製作一個在內部執行一些命令的腳本,這些命令會顯示一些輸出STDOUTSTDERR以及,但這沒問題)。我需要我的腳本生成一個 .tar.gz 文件STDOUT,因此在腳本中執行的一些命令的輸出也會轉到STDOUT,這以輸出中的無效 .tar.gz 文件結束。

所以,簡而言之,可以將第一個命令輸出到螢幕(因為我仍然想看到輸出)但不能通過STDOUT? 另外我想保持STDERR原樣,所以只有錯誤消息出現在那裡。

我的意思的一個簡單例子。這將是我的腳本:

#!/bin/bash

# the output of these commands shouldn't go to STDOUT, but still appear on screen
some_cmd foo bar
other_cmd baz

#the following command creates a tar.gz of the "whatever" folder,
#and outputs the result to STDOUT
tar zc whatever/

我試過弄亂exec文件描述符,但我仍然無法讓它工作:

#!/bin/bash

# save STDOUT to #3
exec 3>&1

# the output of these commands should go to #3 and screen, but not STDOUT
some_cmd foo bar
other_cmd baz

# restore STDOUT
exec 1>&3

# the output of this command should be the only one that goes to STDOUT
tar zc whatever/

我想我STDOUT在第一個 exec 之後缺少關閉並再次重新打開它或其他什麼,但我找不到正確的方法(現在結果與我沒有添加execs

標準輸出是螢幕。標準輸出和“螢幕”之間沒有區別。

在這種情況下,我會1>&2在一個子shell 中臨時將stdout 重定向到stderr。這將導致命令的輸出顯示在螢幕上,但不會出現在程序標準輸出流中。

#!/bin/bash

# the output of these commands shouldn't go to STDOUT, but still appear on screen

# Start a subshell
(
   1>&2                # Redirect stdout to stderr
   some_cmd foo bar
   other_cmd baz
)
# At the end of the subshell, the file descriptors are 
# as they usually are (no redirection) as the subshell has exited.

#the following command creates a tar.gz of the "whatever" folder,
#and outputs the result to STDOUT
tar zc whatever/

您是否有理由需要將此腳本的輸出通過管道傳輸到其他內容?通常,您只需使用-f標誌將 tar 寫入文件或僅對 tar 命令執行重定向:(tar zc whatever > filename.tar.gz除非您將其放在磁帶等設備上或將其用作副本形式)。

引用自:https://serverfault.com/questions/379798