我写了一个脚本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
但这并不像预期的那样有效。
这是重要的信息
那么出了什么问题?我怎么能消失输出?我真的不希望脚本占用我的终端人质。
答案 0 :(得分:4)
echo "This is important message" > /dev/tty
那就是说,“输出到tty”。您无法重定向tty本身。您需要更改脚本。
(使用脚本禁止输出的唯一可行方法是使其与不输出的控制终端一起运行;例如,输出由主设备消耗的伪终端。 There不是我知道要做的任何通用工具见下文。)
您的问题意味着对重定向如何工作/它的作用存在误解。你在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”选项)将指定程序的输入/输出连接到/ dev / null,该终端是控制终端(“setsid”选项)。
答案 1 :(得分:0)
尝试创建文件描述符到/ dev / null,执行echo,然后关闭文件描述符。
#!/bin/bash
#test.sh
exec 5<> /dev/null
echo "This is important message" >&5
exec 5>&-
测试运行脚本和结果:
答案 2 :(得分:0)
如果您具有root
访问权限,则可以将输出重定向到任何虚拟控制台。就像这样。
echo "This is important message" > /dev/tty1