bli*_*bli 2 command-line input
我在grymoire 中阅读了以下内容:
一个简单的例子是将“旧”文件中的“day”更改为“new”文件中的“night”:
sed s/day/night/ <old >new
或者另一种方式(对于 UNIX 初学者),
sed s/day/night/ old >new
为什么作者会认为第一种形式更高级?
我的意思是,与“初学者”语法相比,使用这种形式有什么优势?
允许 shell 执行open()
类似操作的一个优点是:
utility <in >out
Run Code Online (Sandbox Code Playgroud)
与允许命名实用程序执行以下操作相反open()
:
utility in >out
Run Code Online (Sandbox Code Playgroud)
...是在调用命名实用程序之前保护文件描述符,否则如果在调用期间遇到错误open()
,则根本不会调用该实用程序。这是防止可能出现的竞争条件的副作用的最佳方法 - 在使用流和流编辑器时可能会不时发生。
如果重定向失败,shell 会短路对实用程序的调用,并将错误消息写入 stderr - shell 的stderr,而不是您可能临时将其指向实用程序的任何内容(嗯,这取决于命令行顺序重定向以及) - 以标准诊断格式。测试您是否可以打开文件的最简单方法是打开它,并<
在执行任何其他操作之前隐式执行此操作。
您问题中的命令中指出的最明显的竞争条件可能涉及out重定向。在这两种形式中,shell>
也会打开写操作,无论是否sed
可以成功打开第二种形式的读取文件,都会发生这种情况。所以out会被截断——而且可能是不必要的。如果您只想在可以成功打开输入的情况下编写输出,那可能会很糟糕。不过,这不是问题,如果您总是先打开您的输入,就像在第一种形式中所做的那样。
否则,至少有10 个数字引用的文件描述符可以以这种方式使用 shell 重定向语法进行操作,而这些组合可能会变得有点麻烦。
此外,当外壳打开时,描述符不属于被调用的命令——就像它在第二个版本中一样——而是属于外壳,被调用的命令只继承它。它以与在同一复合命令中调用的任何其他命令相同的方式继承,因此命令可以以这种方式共享输入。