用xargs连接bash中的URL

时间:2018-08-17 14:39:55

标签: bash xargs

我正在尝试从输出构建URL,每行只有一个条目。我已经尝试过了:

<stuff> | xargs -L1 -I {} echo "${url}&page=queryresults&j="{}

但是,对于某些长行(它们没有空格,但可以有破折号和下划线),我得到了“ {}”,我希望在其中由<stuff>生成的字符串。如果我在最后的双引号和{}之间添加一个空格,则可以使用,但是我不想使用多余的空格:

<stuff> | xargs -L1 -I {} echo "${url}&page=queryresults&j=" {}

类似地,如果我删除&page=queryresults位,它就可以工作。我不知道为什么。

我在这里想念什么?

它适用于此:

blajob_123abcd_1234567890x

但不是这样:SomeTask_some_long_project_name_with_cumulative_metrics_YYYYMMDD_2018_08_15T00_12345a67b8-scheduled-run-bla-bla-bla-yadda

1 个答案:

答案 0 :(得分:5)

这里完全不需要xargs,没有它,您会更好。保证可以在所有POSIX兼容的外壳上正确运行以下内容:

while IFS= read -r line; do
  printf '%s&page=queryresults&j=%s\n' "$url" "$line"
done

为什么不坚持使用xargs -I {} echo "$url&...&j={}"

  • xargs -I的规范包括以下文本:构造参数不能大于255个字节。如果您的网址很长,则可能会导致截断-似乎与所述的详细信息相符。
  • xargs -I仅包含在POSIX的XSI扩展中;不要求实现这些扩展的平台不需要提供它,或者如果需要,也可以使其具有任何特定方式。
  • 如果您使用xargs printf "$url..."(将URL替换为格式字符串而不是通过占位符),则如果URL包含%符号,则会出现错误。
  • 如果您使用echo,则如果您的URL包含文字反斜杠(请参阅the POSIX specification for echo的APPLICATION USAGE部分),您将有未指定的行为。

也就是说,如果您真的要使用xargs,请考虑(在GNU系统上):

xargs -d $'\n' printf "${url//%/%%}"'&page=queryresults&j=%s\n'

...或者在具有BSD工具的平台上:

tr '\n' '\0' | xargs -0 printf "${url//%/%%}"'&page=queryresults&j=%s\n'

注意:

  • 因为我们没有使用-I,所以255个字符的限制根本不适用。 (类似地,xargs可以将尽可能多的参数传递给/usr/bin/printf的每个实例,以适合其命令行,而不是每次调用都限于一个参数)。
  • 在URL中,我们将所有%文字替换为%%。如果该URL已经正确编码,则不应包含任何反斜杠(它们应该已经被%5C取代)。
  • 使用GNU扩展名-d来指定仅将换行符视为单词之间的定界符,将其视为自变量;这也可以防止文字引号被xargs本身解析和使用。在BSD平台上,将换行符转换为NUL并使用-0可以替代。