Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用文件的行作为命令的参数?_Linux_Unix_Shell_Command Line_Command Line Arguments - Fatal编程技术网

Linux 如何使用文件的行作为命令的参数?

Linux 如何使用文件的行作为命令的参数?,linux,unix,shell,command-line,command-line-arguments,Linux,Unix,Shell,Command Line,Command Line Arguments,比如说,我有一个文件foo.txt指定N参数 arg1 arg2 ... argN 我需要将其传递给命令my_命令 如何将文件的行用作命令的参数?您可以使用反勾号: echo World > file.txt echo Hello `cat file.txt` 如果您的shell是bash(以及其他shell),那么$(cat-afile)的快捷方式是$(

比如说,我有一个文件
foo.txt
指定
N
参数

arg1
arg2
...
argN
我需要将其传递给命令
my_命令


如何将文件的行用作命令的参数?

您可以使用反勾号:

echo World > file.txt
echo Hello `cat file.txt`
如果您的shell是bash(以及其他shell),那么
$(cat-afile)
的快捷方式是
$(
,因此您可以编写:

mycommand "$(< file.txt)"
mycommand“$(
记录在“命令替换”部分的bash手册页中

或者,让您的命令从stdin读取,因此:
mycommand

command `< file`
或(多行变量):

或(多行变量,用
$()
代替
`
):

参考资料:
  • 对于循环语法:

  • 如前所述,您可以使用反勾号或
    $(cat文件名)

    我认为需要注意的是,没有提到的是,您必须记住,shell将根据空格分隔该文件的内容,并将它找到的每个“单词”作为参数提供给您的命令。虽然您可以将命令行参数括在引号中,以便它可以包含空格、转义序列等,但从文件中读取不会做同样的事情。例如,如果您的文件包含:

    a "b c" d
    
    您将得到以下参数:

    a
    "b
    c"
    d
    
    如果要将每一行作为参数,请使用while/read/do结构:

    while read i ; do command_name $i ; done < filename
    
    阅读时
    ;do命令_name$i;完成<文件名
    
    在我的bash shell中,以下功能非常有效:

    cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'
    
    输入文件的位置

    arg1
    arg2
    arg3
    

    很明显,这允许您使用输入文件中的每一行执行多个命令,这是我学到的一个很好的小技巧。

    如果您希望以一种健壮的方式执行此操作,并且适用于每个可能的命令行参数(带空格的值、带换行符的值、带文字引号字符的值、不可打印的值、带全局字符的值等等),它变得更有趣一些


    若要写入文件,请给定参数数组:

    printf '%s\0' "${arguments[@]}" >file
    
    …替换为
    “参数一”
    “参数二”
    等,视情况而定


    要从该文件中读取并使用其内容(在bash、ksh93或另一个最近的带有数组的shell中),请执行以下操作:


    以下是我如何将文件内容作为参数传递给命令:

    ./foo --bar "$(cat ./bar.txt)"
    

    如果您需要做的只是打开文件
    arguments.txt
    ,其中包含内容

    arg1
    arg2
    argN
    
    进入
    my_命令arg1 arg2 argN
    ,您只需使用
    xargs

    xargs -a arguments.txt my_command
    
    你可以在
    xargs
    调用中添加额外的静态参数,比如
    xargs-a arguments.txt my_command staticArg
    ,它将调用
    my_command staticArg arg arg1 arg2 argN

    在编辑了几次之后,我觉得我的更改太大了,无法继续更改他的答案而不是编写我自己的答案。因此,我决定我需要写我自己的

    在中读取文件的每一行,并按如下方式逐行操作:

    #!/bin/bash
    input="/path/to/txt/file"
    while IFS= read -r line
    do
      echo "$line"
    done < "$input"
    
    参考资料:
  • 我从中复制了我的答案:
  • 对于循环语法:
  • 相关的:
  • 如何逐行读取文件内容并在其上执行
    git add
  • 我建议使用:

    command $(echo $(tr '\n' ' ' < parameters.cfg))
    
    command$(echo$(tr'\n'

    只需修剪结束行字符并用空格替换它们,然后使用echo将结果字符串作为可能的独立参数推送。

    没有一个答案对我有效或太复杂。幸运的是,使用
    xargs
    (在Ubuntu 20.04上测试)并不复杂

    这与OP提到的文件中单独一行上的每个arg一起工作,这也是我所需要的

    cat foo.txt | xargs my_command
    
    需要注意的一点是,它似乎不适用于别名命令

    如果命令接受一个字符串中包含的多个参数,那么接受的答案就起作用了。在我的例子中,使用(Neo)Vim时,它不起作用,并且这些参数都粘在一起


    xargs
    可能并实际上为您提供了单独的命令参数。

    我应该提到,我假设您使用的是bash。我知道还有其他shell,但我使用过的几乎所有*nix机器都运行bash或其他等效程序。IIRC,这种语法应该是相同的在ksh和zsh上,Read应该是
    Read-r
    ,除非您想扩展反斜杠转义序列,而且NUL是比换行符更安全的分隔符,特别是当您传递的参数是文件名之类的东西时,它可以包含文字换行符。此外,在不清除IFS的情况下,您会隐式地得到前导空格和尾随空格从
    i
    参数、复数或“参数”中清除,single?接受的答案仅在单参数情况下是正确的——这是正文所查询的内容——但在主题似乎要查询的多参数情况下是不正确的。下面的4个答案通常有相同的结果,但它们的语义略有不同。现在我想起了为什么我停止编写bash脚本:PYour“漂亮的小把戏”从安全角度来看是危险的——如果你有一个参数包含
    $(somecommand)
    ,你将得到该命令的执行,而不是作为文本传递。同样地,
    /etc/passwd
    将被处理为重定向和覆盖
    /etc/passwd
    (如果使用适当的权限运行)(在具有GNU扩展的系统上)执行以下操作更安全:
    xargs-d$'\n'sh-c'表示arg;do command1“$arg”;command2“arg”;command3“arg”;done'
    ——而且效率更高,因为它向每个shell传递尽可能多的参数,而不是在输入文件中每行启动一个shell。当然,也会丢失,将
    放在backticks中意味着它根本不执行
    命令的重定向。(投票人是否真的测试了它?
    命令`
    在bash或POSIX sh中都不起作用;
    ./foo --bar "$(cat ./bar.txt)"
    
    arg1
    arg2
    argN
    
    xargs -a arguments.txt my_command
    
    #!/bin/bash
    input="/path/to/txt/file"
    while IFS= read -r line
    do
      echo "$line"
    done < "$input"
    
    while IFS= read -r line
    do
        echo "  git add \"$line\""
        git add "$line" 
    done < "$FILES_STAGED"
    
    command $(echo $(tr '\n' ' ' < parameters.cfg))
    
    cat foo.txt | xargs my_command