redirect之后的一个参数能做什么吗?

redirect被忽略之后是否有任何争论,还是会有意想不到的后果?

我很惊讶地发现,我在bash脚本中犯的一个错字没有任何区别,因为它是在redirect之后指定的。 比如我预料它会抱怨这样的事情

./foo.sh > foo2.log whoops I made a typo 

但它不会抛出任何错误。 我不得不添加一个分号来让它像命令和错误一样运行

 ./foo.sh > foo2.log; whoops I made a typo 

更令我吃惊的是,linuxredirect后并没有放弃,比如说

 ./foo.sh > foo2.log whoops I made a typo > command_is_still_going.log 

是绝对好的,command_is_still_going.log仍然被创build

“哎呀,我犯了一个错字”的说法完全被忽略了,还是会导致一些不必要的行为? 因为我倾向于使用这个很多。

Solutions Collecting From Web of "redirect之后的一个参数能做什么吗?"

重定向被解析和处理,然后从命令行中删除。 剩下的命令行然后被执行。 换句话说,重定向可以出现在命令行的任何地方。 作为一个风格点,你应该把它们放在最后。

这些是等价的:

 ./foo.sh > foo2.log whoops I made a typo ./foo.sh whoops I made a typo > foo2.log 

如果foo.sh忽略它的论点,那么“哎呦,我犯了一个错字”没有任何效果。

同样,这些是一样的:

 ./foo.sh > foo2.log whoops I made a typo > command_is_still_going.log ./foo.sh whoops I made a typo > foo2.log > command_is_still_going.log 

这是两个单独的命令:

 ./foo.sh > foo2.log; whoops I made a typo ./foo.sh > foo2.log whoops I made a typo 

你可以运行:

 > set -x > ./foo.sh > foo2.log whoops I made a typo 

你可以看到实际运行的是什么:

 > + ./foo.sh whoops I made a typo 

如上所示,额外的文本作为参数传递给foo.sh.

好的,我想我有我的答案。 直接在Linux中,你可以做一些事情,如echo 'whoops' > foo.log I made a typo ,这将输出到屏幕“哎呦,我犯了一个错字”

所以基本上重定向只是从行的处理中剥离出来,所以在重定向作为bash脚本的参数被处理之后,意外的结果将是任何东西。

通过使foo.sh简单地echo $1证明这一点。 然后以./foo.sh > foo.log whatever运行, ./foo.sh > foo.log whatever日志“whatever”作为第一个参数