将输入传递给脚本:stdin与argv中的文件路径

时间:2012-11-29 17:23:52

标签: bash shell coding-style

我编写了许多用于测试或处理CSV文件的简单脚本。大多数脚本具有相同的逻辑:读取一个文件并将输出写入控制台或其他文件。对于这种情况,我通常使用最简单的实现方法:从stdin读取,写入stdout,因此调用如下:

script < input.csv > output.csv

你能否说一下为什么我更喜欢这种风格:

script input.csv > output.csv

甚至:

script input.csv output.csv

2 个答案:

答案 0 :(得分:0)

以下是如何使用可以处理两者的脚本(不保证100%安全,可能有人可以提供更好的选项或在评论中查明严重问题):

#!/bin/bash

if [[ -n $1 ]]; then
    exec "$0" < "$1" || exit $?
fi

# your program starts here, reading stdin, e.g.,
while read; do
   echo "$REPLY"
done

答案 1 :(得分:0)

这就是我现在处理相同任务的方式,类似于@ gniourf_gniourf的答案(除了我的脚本在Haskell中)。

当使用参数调用程序时,如-,将它们视为输入文件并忽略标准输入,但特殊情况除外,当一个或多个参数为CMD时。

当没有给出args时,读取标准输入。因此,CMD -无args的调用等同于.container { bottom: 0px; display: flex; flex-direction: column; left: 0px; position: absolute; right: 0px; top: 0px; } .container > .header { background: yellow; flex-shrink: 1; } .container > .content { background: black; color: white; flex-grow: 1; }