重定向后是否有任何参数被忽略,或者是否有任何意外后果?
我很惊讶地发现我在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;参数完全被忽略,还是会导致一些不必要的行为?因为我倾向于使用这个。
答案 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'记录为第一个参数