代码之家  ›  专栏  ›  技术社区  ›  Jacob Nelson

带有数据文件的命令行参数

  •  1
  • Jacob Nelson  · 技术社区  · 14 年前

    我一直在使用:

    ./theapp < datafile1 < datafile2 arg1 arg2 arg3 > outputfile
    

    但我想知道它是否有可能看起来像这样:

    ./the app datafile1 datafile2 arg1 arg2 arg3 > outputfile
    

    2 回复  |  直到 14 年前
        1
  •  3
  •   paxdiablo    14 年前

    将两个文件合并成这样的标准输入有点困难。最好是:

    cat datafile1 datafile2 | ./theapp arg1 arg2 arg3 >outputfile
    

    bash (至少),第二个输入重定向会覆盖第一个,而不会增加它。您可以通过两个命令看到:

    cat <realfile.txt </dev/null # no output.
    cat </dev/null <realfile.txt # outputs realfile.txt.
    

    看到 >outputfile

    ./theapp arg1 arg2 arg3
    

    与标准输入一样,它由shell处理。

    上面第一个命令唯一可能的问题是,它将两个文件合并成一个流,这样您的程序就不知道第一个文件的结尾和第二个文件的开头(除非它能从文件的内容中推断出这一点)。

    如果您想处理多个文件并知道它们是哪一个,则有一个悠久的传统,即执行以下操作:

     ./theapp arg1 arg2 arg3 @datafile1 @datafile2 >outputfile
    

        2
  •  1
  •   zwol    14 年前

    从程序的角度来看,所有命令行参数都是字符串,您必须自己决定它们是否表示文件名。在Unix上,只有两个字节不能出现在文件名中:0x00和0x2F( NUL / 字节 . 除了HFS+,Unix文件系统完全不注意字符编码,当然,明智的人使用UTF-8。]

    Shell重定向不出现在 argv 完全。

    不过,有一个约定:对待 阿格夫 (除 argv[0] fopen (或 open )照原样。如果字符串 "-" 阿格夫 ,在该点处理标准输入,直到耗尽,然后继续循环 阿格夫 "--" 出现在 阿格夫 ,将该点之后的所有内容都视为文件名,无论它是否以破折号开头。(包括随后出现的 "-" "--" ).

    for (<>) {
       ... do stuff with $_ ...
    }
    

    你可以免费得到我在“有个会议…”一段中说的一切。(但你说的是C,所以,嗯,你得自己做大部分。我不知道普通C的参数处理库是否值得占用磁盘空间。:-( )