Linux
將 STDOUT 臨時重定向到另一個文件描述符,但仍重定向到螢幕
我正在製作一個在內部執行一些命令的腳本,這些命令會顯示一些輸出
STDOUT
(STDERR
以及,但這沒問題)。我需要我的腳本生成一個 .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 之後缺少關閉並再次重新打開它或其他什麼,但我找不到正確的方法(現在結果與我沒有添加exec
s
標準輸出是螢幕。標準輸出和“螢幕”之間沒有區別。
在這種情況下,我會
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
除非您將其放在磁帶等設備上或將其用作副本形式)。