这是正常的重定向。
user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$
2>
user@linux:~$ randomcommand 2> /dev/null
user@linux:~$
&>
user@linux:~$ randomcommand &> /dev/null
user@linux:~$
但是,当我尝试使用如下所示的不同命令执行相同操作时,它不起作用。
&>
user@linux:~$ > /dev/tcp/127.0.0.1/22 &> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$
2>
user@linux:~$ > /dev/tcp/127.0.0.1/22 2> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$
这些语法有什么问题以及如何解决?
在bash
处理> /dev/tcp/localhost/22
重定向时输出错误,并且此时stderr尚未被重定向。只需更改这两个重定向的顺序即可:
if 2> /dev/null > /dev/tcp/127.0.0.1/22; then
echo open
else
echo closed
fi
请注意,这些/dev/tcp/host/port
不是真实文件。bash
(或ksh
该功能的来源)检测到您正在尝试重定向到那些特殊文件的事实(您会注意到,如果将其更改为它/dev/./tcp
或/dev//tcp
不再起作用),而不是打开这些文件,而是创建一个TCP套接字并尝试connect()
在主机和端口上使用它。当connect
失败的时候bash
报告一个错误。
zsh
ztcp
在zsh/net/tcp
模块中有一个内置命令来代替它,这使它更加直观,并且还允许服务器端连接之类的更多功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句