为什么xargs没有执行我的shell脚本?

时间:2014-04-08 16:18:26

标签: bash xargs

我需要使用drush(Drupal shell)来报告一长串模块 - 基本上这是一个单行shell脚本,其中包含文件中的模块名称列表。 xargs应该可以做到这一点,但我无法让它工作。

我的shell脚本drpm.sh看起来像:

#!/bin/bash
drush pm-releases $1

我输入文件的前几行如下:

admin_menu
advanced_help
aggregator
anonymous_contact
ldapauth
...

(顺便说一句,文件中的行由^ M终止,如果重要的话......)

但是当我运行命令时:

xargs -0 -L 1 -a myfilename.txt ./drpm.sh

我得到了结果:

No release history was found for the requested project (admin_menu                                                                                                                      [warning]
).
No release history was found for the requested project (advanced_help                                                                                                                   [warning]
).
No release history was found for the requested project (aggregator                                                                                                                      [warning]
)....

但如果我输入./drpm.sh admin_menu,我会得到:

------- RELEASES FOR 'ADMIN_MENU' PROJECT -------
 Release         Date         Status
 6.x-3.x-dev     2013-Sep-30  Development
 6.x-3.0-alpha4  2010-Mar-11  Supported
 6.x-1.x-dev     2013-Sep-30  Development
 6.x-1.8         2011-Jun-16  Supported, Recommended

这是我想在输入文件中获取整个列表的结果。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要查看自己的xargs联机帮助页,了解它可以使用的不同参数。 Gnu vs. BSD vs. System VII都不同。

但是,在我的Mac(BSD)上,-0参数表示文件名是NULL分隔而不是空格分隔。然而,你的名字是空白分隔的。摆脱-0它可能会有效。

我还注意到你正在使用-L 1每个条目调用一次命令。 xargs的全部目的是尽可能少地调用该程序。如果您打算每个项目名称调用一次,只需使用循环:

while read project
do
    ./drpm.sh $project
done < myfilename.txt

答案 1 :(得分:0)

您的输入未被NUL(\0)个字符(作为分隔符)分隔,因此-0不需要xargs参数。

所以保持简单:

xargs -L1 ./drpm.sh < myfilename.txt