【问题标题】:Using file contents as command line arguments in BASH在 BASH 中使用文件内容作为命令行参数
【发布时间】:2009-11-04 14:18:19
【问题描述】:

我想知道如何使用文件的内容作为命令行参数,但在语法上遇到了困难。

假设我有以下内容:

# cat > arglist
src/file1 dst/file1
src/file2 dst/file2
src/file3 dst/file3

如何将arglist 文件中每一行的内容用作cp 命令的参数?

【问题讨论】:

    标签: bash redirect


    【解决方案1】:

    xargs 的“-n”选项指定每个命令使用多少个参数:

    $ xargs -n2 < arglist echo cp
    
    cp src/file1 dst/file1
    cp src/file2 dst/file2
    cp src/file3 dst/file3
    

    【讨论】:

      【解决方案2】:

      使用read(这确实假设arglist 中文件名中的任何空格都被转义了):

      while read src dst; do cp "$src" "$dst"; done < argslist
      

      如果文件中的参数顺序正确并且带有空格的文件名被引用,那么这也将起作用:

      while read args; do cp $args; done < argslist
      

      【讨论】:

      • 如果没有最后一个换行符,while 读取循环将“错过”读取最后一行。
      【解决方案3】:

      你可以使用管道(|):

      cat file | echo
      

      或输入重定向(

      cat < file
      

      xargs

      xargs sh -c 'emacs "$@" < /dev/tty' emacs
      

      然后你可以使用 awk 来获取参数:

      cat file | awk '{ print $1; }'
      

      希望这会有所帮助..

      【讨论】:

      • 所有这些都做了某事,但它们都偏离了目标。
      • echo 不是从 stdin 读取的。除了cat 不需要echo。此外,您不必重定向到 cat - 这有效:cat file
      • 是的,我知道,一开始我并不太明白他想要什么。我坚持输出就像“ls”,我的意思是在cols上减少行数。这就是我谈到 shell 重定向的原因。 (英语不是我的母语,抱歉:))
      【解决方案4】:

      如果您的目的只是 cp 列表中的那些文件

      $ awk '{cmd="cp "$0;system(cmd)}' file
      

      【讨论】:

      • 使用 shell 时没有什么不同。 shell 也在调用系统命令。
      【解决方案5】:

      使用for 循环并将IFS(内部字段分隔符)设置为new line

      OldIFS=$IFS # Save IFS
      $IFS=$'\n' # Set IFS to new line
      for EachLine in `cat arglist"`; do
      Command="cp $Each"
      `$Command`;
      done
      IFS=$OldIFS
      

      【讨论】:

      • 不必将命令及其参数放入变量中。无论如何,您必须执行 $Command`$Command` 才能使其正常工作。
      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2019-01-27
      • 2013-10-17
      • 2012-08-08
      • 1970-01-01
      • 2016-07-14
      相关资源
      最近更新 更多