2016-06-10 78 views
1

我寫了一個腳本test.sh將輸入重定向到文件描述符?

#!/bin/bash 
#test.sh 

echo "This is important message" > /dev/tty 

,當我試圖在bash

./test.sh 

執行這是重要的信息

我通常不喜歡的終端上

消息
./test.sh > /dev/null 

好,產量從來沒有到標準輸出

這是重要的信息

這是相當煩人。我真的不喜歡一些故意傾倒在終端上的信息。因此,這就是我所做的。

exec 3<> /dev/tty 
./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null 

但這並不按預期方式工作。

這是重要的信息

那麼,是什麼問題呢?我該如何消失輸出?我真的不希望腳本把我的終端作爲人質。

+3

爲什麼從腳本內部向** tty **回覆消息?爲什麼不把這條線設爲'echo「這是一條重要的信息,''然後控制shell的輸出。 – Kadir

+0

在腳本中,我已經使用'eval「./test.sh&>。/ test_command.log'將輸出從控制檯窗口重新路由到文本文件'test_command.log'。您是否嘗試過插入'&'在你的'>'之前?順便說一句,對I/O重新路由的所有不同可能性有一個很好的解釋[TLDP指南](http://www.tldp.org/LDP/abs/html/ io-redirection.html) –

+1

@ VladislavMartin這不會將輸出重定向到控制檯窗口;「eval」是不必要的,它只是重新路由標準輸出和標準錯誤(兩者都可能先前*已附加到控制檯)到一個文件 – chepner

回答

4
echo "This is important message" > /dev/tty 

這是說, 「輸出到TTY」。你不能重定向tty本身。你需要改變你的腳本。

(腳本禁止輸出的唯一可能方式是使其不受輸出的控制終端運行;例如,其輸出被主節點佔用的僞終端 There aren我不知道這樣做的通用工具 見下文)。

您的問題意味着重定向的工作方式/做什麼的誤解。您在shell寫的行不這樣做,你似乎在想什麼:

exec 3<> /dev/tty 

這重定向#3文件描述符(這通常不與任何相關反正),以控制終端。

./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null 

不;它將任何指向文件描述符#3的內容發送到文件描述符#1(它是/ dev/null)的當前目標。但是這不會影響你的腳本,它明確地向tty設備發送消息(控制終端,它通常是你運行命令的終端)。具體來說,腳本中的echo命令輸出到stdout(文件描述符#1),該命令將該命令重定向到/dev/tty,即控制終端。

使用socat改變控制終端

可以使用「socat」程序到控制終端改變到僞終端和重定向主輸出到/ dev/null,則具有類似的命令行以下內容:

socat EXEC:./test.sh,pty,setsid /dev/null

該socat程序的輸入信宿/輸出源連接到另一輸入水槽/輸出源。在這種情況下,它通過作爲控制終端的僞終端(「pty」選項)(「setsid」選項)將指定程序的輸入/輸出連接到/ dev/null。

+0

腳本無法更改。假定它是給我的。只有窺視它才能看到上述線條。 –

+0

另外我不想重定向tty本身。我想重定向發送給tty的任何和所有可能的輸出。那可能嗎? –

+0

你是什麼意思的「僞終端,其輸出被主人消費」?你能詳細說明一下嗎? –

0

嘗試將文件描述符創建爲/ dev/null,執行echo操作,然後關閉文件描述符。腳本和結果的

#!/bin/bash 
#test.sh 

exec 5<> /dev/null 
echo "This is important message" >&5 
exec 5>&- 

試運行:

enter image description here

0

如果您有root訪問權限,您可以將輸出重定向到任何虛擬控制檯。像這樣。

echo "This is important message" > /dev/tty1