您的重定向是无意义的(没有违法)。
此:
echo 1 > /proc/sys/net/ipv4/ip_forward >/dev/null 2>&1
将:
- 重定向
echo
的标准输出到/proc/sys/net/ipv4/ip_forward
;
- 重定向
echo
的标准输出到/dev/null
- 重定向
echo
的标准误差到文件描述符1
点,即,/dev/null
。
因此,全局重定向2取消重定向1:什么都不会去/proc/sys/net/ipv4/ip_forward
!
我想你想重定向echo
的标准输出为/proc/sys/net/ipv4/ip_forward
和echo
的标准错误为/dev/null
。这是通过:
echo 1 > /proc/sys/net/ipv4/ip_forward 2>/dev/null
但阅读,我相信这不是你要找的答案!
你为什么要echo
的标准错误重定向到/dev/null
? echo
很少写入标准错误。实际上,只有当写入错误时,写入标准错误的唯一时间是echo
。有一对夫妇的方式,这可能会发生:
如果磁盘已满(可与/dev/full
模拟):
$ echo hello >/dev/full
bash: echo: write error: No space left on device
$ echo hello >/dev/full 2>/dev/null
$
(与重定向2>/dev/null
显示任何错误消息)。
echo
如果的标准输出关闭:
$ (exec >&-; echo hello)
bash: echo: write error: Bad file descriptor
$ (exec >&-; echo hello 2> /dev/null)
$
(与重定向2>/dev/null
显示任何错误消息)。
可能还有其他情况,其中echo
输出为标准错误。但接下来的肯定不是其中:
重定向echo
的标准输出到一个不存在的文件描述:
$ echo hello >&42
bash: 42: Bad file descriptor
$ echo hello >&42 2>/dev/null
bash: 42: Bad file descriptor
$
2>/dev/null
不能解决任何重定向;您实际上可以看到错误来自bash
而不是来自echo
(后者将bash: echo:
作为前缀)。
重定向echo
的标准输出到一个文件中没有写权限:
$ touch testfile
$ chmod -w testfile
$ echo hello > testfile
bash: testfile: Permission denied
$ echo hello > testfile 2>/dev/null
bash: testfile: Permission denied
$
同上,重定向2>/dev/null
不能解决任何事情。
前面的情况下不被2>/dev/null
固定的,因为在打击的水平发生了错误,之前甚至执行命令和重定向进行的,因为它是在那猛砸遇到一个错误重定向的时刻:它无法打开写入流并将错误消息输出到标准输出。 †
现在,我想你试图解决以下情形:当用户没有足够的权利写入/proc/sys/net/ipv4/ip_forward
:
$ echo 1 >/proc/sys/net/ipv4/ip_forward
bash: /proc/sys/net/ipv4/ip_forward: Permission denied
$
标准错误,错误消息不能被重定向用简单的重定向‡:
$ echo 1 >/proc/sys/net/ipv4/ip_forward 2>/dev/null
bash: /proc/sys/net/ipv4/ip_forward: Permission denied
$
重定向发生在重定向平的误差的标准方法(即,甚至执行命令之前)是使用分组:
$ { echo 1 >/proc/sys/net/ipv4/ip_forward; } 2>/dev/null
现在,解释了为什么你张贴一个答案解决方案的工作:让我们通过它,我们会看到有什么东西,显示您没有完全理解重定向(希望这篇文章能帮助你理解一些东西);你的代码是:
function ip_forward
{
echo 1 > /proc/sys/net/ipv4/ip_forward
}
ip_forward >/dev/null 2>&1
这将运行功能ip_forward
,并重定向:
- 它的标准输出
/dev/null
;
- 然后将其标准误差输出到其标准输出点(即
/dev/null
)。
但是函数ip_forward
不会输出任何内容到标准输出!所以重定向>/dev/null
是只有有用的2>&1
部分的重定向。事实上,你的代码是完全等同于:
function ip_forward
{
echo 1 > /proc/sys/net/ipv4/ip_forward
}
ip_forward 2>/dev/null
但后来(因为你只用一个函数构造的方式来达到你有什么想要的,不是因为你想要的功能),它是更好写你代码之一:
echo 1 2>/dev/null >/proc/sys/net/ipv4/ip_forward
或
{ echo 1 > /proc/sys/net/ipv4/ip_forward; } 2>/dev/null
(后者是优选的)。
对不起,这篇文章很长!
† 我们应该注意的是:重定向的顺序。当Bash读取它们时,它们从左到右执行。我们如何首先重定向标准错误,然后将标准输出重定向到不存在/不可写的流?
$ echo hello 2>/dev/null >&42
$
这是正确的,它的工作原理。
‡ 好,可以,如果你理解一个脚注:
$ echo 1 2>/dev/null >/proc/sys/net/ipv4/ip_forward
$ echo $?
1
$
在标准错误没有错误!这是因为重定向的顺序。
目前尚不清楚您尝试解决什么问题。对于命令,每个文件描述符只能有一个重定向。 – chepner
我想执行'echo 1>/proc/sys/net/ipv4/ip_forward',如果出错了,我想stderr和stdout(错误信息和输出)被重定向到/ dev/null。换句话说,当发生错误时,我不想要任何消息。 – Stan
您不必再次重定向标准输出;它已经到了'/ proc/...'你只需要'echo 1>/proc/... 2>/dev/null'。 – chepner