重定向后的参数是否可以执行任何操作?

时间:2017-09-18 14:57:49

标签: linux bash redirect

重定向后是否有任何参数被忽略,或者是否有任何意外后果?

我很惊讶地发现我在bash脚本中输入的拼写错误完全没有区别,因为它是在重定向后指定的。例如。我期待它抱怨这样的事情

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

但它并没有抛出任何错误。我必须添加一个半冒号实际上让它作为命令和错误运行,如

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

令我更惊讶的是,在重定向之后,linux还没有放弃 e.g。

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

绝对没问题,仍然创建了command_is_still_going.log

我是不是已经打错了#39;参数完全被忽略,还是会导致一些不必要的行为?因为我倾向于使用这个。

3 个答案:

答案 0 :(得分:6)

解析并处理重定向,然后从命令行中删除。然后执行剩余的命令行。换句话说,重定向可以出现在命令行中的任何位置。作为一种风格,你应该把它们放在最后。

这些是等价的:

./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

答案 1 :(得分:1)

你可以跑:

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

你可以看到实际运行的内容:

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

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

答案 2 :(得分:0)

好吧,我想我有答案。直接在linux中你可以做的事情 echo 'whoops' > foo.log I made a typo 这将输出到屏幕'哎呀我写了一个错字'

所以基本上重定向只是从行的处理中删除,因此在将重定向作为bash脚本的参数处理之后,意外的结果将是任何内容。

通过使foo.sh简单echo $1来证明这一点。然后运行它 ./foo.sh > foo.log whatever将'what'记录为第一个参数