将输入重定向到文件描述符?
Redirect input to a file descriptor?
我写了一个脚本test.sh
#!/bin/bash
#test.sh
echo "This is important message" > /dev/tty
当我尝试在 bash
上执行时
./test.sh
This is important message
我通常不喜欢终端上的消息
./test.sh > /dev/null
好的,输出从来没有到标准输出
This is important message
这很烦人。我真的不喜欢故意将一些消息转储到终端上。因此,这就是我所做的。
exec 3<> /dev/tty
./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null
但这并不像预期的那样有效。
This is important message
那到底出了什么问题?我应该如何使输出消失?我真的不希望脚本劫持我的终端。
尝试为 /dev/null 创建文件描述符,执行回显,然后关闭文件描述符。
#!/bin/bash
#test.sh
exec 5<> /dev/null
echo "This is important message" >&5
exec 5>&-
测试 运行 脚本和结果:
echo "This is important message" > /dev/tty
也就是说,"output to the tty"。您不能重定向 tty 本身。您需要改为更改脚本。
(唯一可能的方法是使用不输出的控制终端使其 运行 成为脚本的输出;例如,一个伪终端,其输出被大师。据我所知,没有任何通用工具可以执行此操作,请参见下文)。
您的问题暗示了对重定向的工作原理/作用的误解。您在 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
命令输出到标准输出(文件描述符 #1),对于该命令,标准输出被重定向到 /dev/tty
,即控制终端。
使用socat更改控制终端
您可以使用 "socat" 程序将控制终端更改为伪终端并将主输出重定向到 /dev/null,使用类似于以下的命令行:
socat EXEC:./test.sh,pty,setsid /dev/null
socat 程序将输入 sink/output 源连接到另一个输入 sink/output 源。在这种情况下,它通过伪终端("pty" 选项)将指定程序的 input/out 连接到 /dev/null,伪终端("pty" 选项)成为控制终端("setsid" 选项)。
如果您有 root
访问权限,您可以将输出重定向到任何虚拟控制台。就这样。
echo "This is important message" > /dev/tty1
我写了一个脚本test.sh
#!/bin/bash
#test.sh
echo "This is important message" > /dev/tty
当我尝试在 bash
./test.sh
This is important message
我通常不喜欢终端上的消息
./test.sh > /dev/null
好的,输出从来没有到标准输出
This is important message
这很烦人。我真的不喜欢故意将一些消息转储到终端上。因此,这就是我所做的。
exec 3<> /dev/tty
./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null
但这并不像预期的那样有效。
This is important message
那到底出了什么问题?我应该如何使输出消失?我真的不希望脚本劫持我的终端。
尝试为 /dev/null 创建文件描述符,执行回显,然后关闭文件描述符。
#!/bin/bash
#test.sh
exec 5<> /dev/null
echo "This is important message" >&5
exec 5>&-
测试 运行 脚本和结果:
echo "This is important message" > /dev/tty
也就是说,"output to the tty"。您不能重定向 tty 本身。您需要改为更改脚本。
(唯一可能的方法是使用不输出的控制终端使其 运行 成为脚本的输出;例如,一个伪终端,其输出被大师。据我所知,没有任何通用工具可以执行此操作,请参见下文)。
您的问题暗示了对重定向的工作原理/作用的误解。您在 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
命令输出到标准输出(文件描述符 #1),对于该命令,标准输出被重定向到 /dev/tty
,即控制终端。
使用socat更改控制终端
您可以使用 "socat" 程序将控制终端更改为伪终端并将主输出重定向到 /dev/null,使用类似于以下的命令行:
socat EXEC:./test.sh,pty,setsid /dev/null
socat 程序将输入 sink/output 源连接到另一个输入 sink/output 源。在这种情况下,它通过伪终端("pty" 选项)将指定程序的 input/out 连接到 /dev/null,伪终端("pty" 选项)成为控制终端("setsid" 选项)。
如果您有 root
访问权限,您可以将输出重定向到任何虚拟控制台。就这样。
echo "This is important message" > /dev/tty1