あなたのリダイレクトは無意味です(違反はありません)。
この:
echo 1 > /proc/sys/net/ipv4/ip_forward >/dev/null 2>&1
は以下となります。
- リダイレクト
echo
の標準出力/proc/sys/net/ipv4/ip_forward
します。 /dev/null
から
- リダイレクト
echo
場合、ファイルディスクリプタ1
点、すなわち標準誤差Sのecho
/dev/null
- リダイレクトする標準出力 '、。
したがって、グローバルにリダイレクト2はリダイレクトをキャンセルします1:何も/proc/sys/net/ipv4/ip_forward
にはなりません!
の標準出力を/proc/sys/net/ipv4/ip_forward
に、echo
を標準エラー/dev/null
にリダイレクトしたいと思います。これは次のように達成されます:
echo 1 > /proc/sys/net/ipv4/ip_forward 2>/dev/null
しかし、私はそれがあなたが探している答えではないと信じています!
は、なぜあなたは/dev/null
にecho
の標準エラーをリダイレクトするようにしたいですか? 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
は何も解決しません。
コマンドがあっても実行され、リダイレクションが実行される前にエラーが、バッシュのレベルで起こるので、それはbashはエラーが発生したリダイレクションの瞬間だから前ケースは、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
はのみリダイレクションの一部に役立ちます。実際には、あなたのコードは、と完全に同等である:(あなたが機能をしたいので、あなただけが-ない望んでいたものを達成するための方法として、関数構文を使用しているため)、その後
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
$
エラーはありませんが!それはリダイレクトの順序のためです。
あなたが解決しようとしている問題は明確ではありません。コマンドには、ファイル記述子ごとに1つのリダイレクションしか指定できません。 – chepner
私は 'echo 1>/proc/sys/net/ipv4/ip_forward'を実行したいのですが、これがうまくいかない場合は、stderrとstdout(エラーメッセージと出力)を/ dev/nullにリダイレクトします。言い換えれば、エラーが発生したときに私は何のメッセージも望まない。 – Stan
標準出力を再度リダイレクトする必要はありません。すでに '/ proc/...'に行きます。 'echo 1>/proc/... 2>/dev/null'だけが必要です。 – chepner