Moj*_*imi 11 command-line bash
我有一个名为 requirements.txt 的文件,每一行都有一个包:
package1
package2
package3
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个命令,它将获取requirements.txt 的每一行并将它们连接在一行中,空格分隔。
所以基本上,我希望生成以下命令:
command package1 package2 package3
Run Code Online (Sandbox Code Playgroud)
我尝试使用 for 并申请command每一行,requirements.txt但速度要慢得多
ste*_*ver 14
您可以使用xargs, 并将分隔符设置为换行符 ( \n):这将确保参数得到正确传递,即使它们包含空格:
xargs -rd'\n' command < requirements.txt
Run Code Online (Sandbox Code Playgroud)
从手册页:
-r,--no-run-if-empty
如果标准输入不包含任何非空格,请不要运行该命令。通常,即使没有输入,命令也会运行一次。此选项是 GNU 扩展。
--delimiter=delim,-d delim
输入项以指定字符结束。
des*_*ert 10
您可以简单地使用bash重定向和命令替换来获取文件内容作为命令的参数:
command $(<file)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为不仅空格是一个有效的分词字符,而且换行符也是如此——你不需要替换任何东西。但是,在多行的情况下,您将收到一个关于 shellARG_MAX限制的错误(就像使用替换解决方案一样)。使用printf内置的参数和一个列表xargs从中内置命令行来解决如下:
printf "%s\0" $(<file) | xargs -0 command
Run Code Online (Sandbox Code Playgroud)
请注意,这些方法都不适用于包含空格或通配符的行(当然除了换行符) - 幸运的是包名不适用(AFAIK)。如果行中有空格或通配符,xargs请使用(请参阅此答案)或parallel(请参阅此答案)。