【问题标题】:xargs input involving spaces涉及空格的 xargs 输入
【发布时间】:2016-08-03 19:48:28
【问题描述】:

我正在使用 OSX 的 Mac 上工作,并且我使用 bash 作为我的 shell。我有一个脚本可以达到以下效果:

VAR1="pass me into parallel please!"
VAR2="oh me too, and there's actually a lot of us, but its best we stay here too"
printf "%s\n" {0..249} | xargs -0 -P 8 -n 1 . ./parallel.sh

我收到错误:xargs: .: Permission denied。目的是并行运行另一个脚本(称为parallel.sh),该脚本输入数字0-249。此外,我想确保并行可以看到我们 VAR1 和 VAR2。但是当我尝试获取与. ./parallel 并行的脚本时,xargs 不喜欢这样。采购的重点是因为脚本还有其他我希望并行访问的变量。

我读过一些关于使用 print0 的内容,因为 xargs 用空格分隔它的输入,但我真的不明白 -print0 的作用以及如何使用它。感谢你们提供的任何帮助。

【问题讨论】:

  • 额外的. 有什么用?
  • “并行运行”和“并行访问”是什么意思?您希望多个进程运行 parallel.sh 脚本并通过共享变量进行通信?
  • 这不就是让脚本中声明的变量可用于并行脚本吗?我以为这就是你“采购”的方式。请记住,我充其量只是个新手。
  • @VaughnCato 我重写了原始帖子以尝试更好地解释。但简而言之,是的,我希望运行多个 parallel.sh 进程,并且我希望它们都能够读取变量。

标签: bash shell xargs


【解决方案1】:

如果您希望多个进程运行脚本,则它们不能成为父进程的一部分,因此它们无法访问完全相同的变量。但是,如果您导出变量,则每个进程都可以获得它们的副本:

export VAR1="pass me into parallel please!"
export VAR2="oh me too, and there's actually a lot of us, but its best we stay here too"
printf "%s\n" {0..249} | xargs -P 8 -n 1 ./parallel.sh

现在你可以去掉多余的点,因为你不是在获取 parallel.sh 脚本,你只是在运行它。

也没有必要使用-0,因为您的输入只是一系列数字,每行一个。

【讨论】:

  • bash 没有 extern 关键字;我想你的意思是export
  • @chepner:天啊。谢谢!今天写了太多 C 代码... :)
  • 不是使用xargs 运行parallel 而是...矫枉过正?来自parallel 手册页:如果您今天使用xargs,您会发现GNU parallel 非常易于使用,因为GNU parallel 被编写为具有与xargs 相同的选项
【解决方案2】:

我认为您有权限问题,请尝试获取该文件“parallel.sh”的执行权限

命令对我来说很好用:

Kaizen ~/so_test $ printf "%s\n" {0..4} | xargs -0 -P 8 -n 1 echo
0
1
2
3
4

人发现:

-print0

是的;在标准输出上打印完整的文件名,后跟 空字符(而不是 -print 使用的换行符)。 这允许处理查找的程序正确解释包含换行符或其他类型空格的文件名 输出。该选项对应xargs的-0选项。

供 print0 使用:检查链接:堆栈溢出中有一个问题

Capturing output of find . -print0 into a bash array

【讨论】:

    【解决方案3】:

    传递参数的问题与 xarg 对空白的解释有关。从 xargs 手册页:

    -0      Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines.
    

    环境变量的问题可以通过export使变量对子进程可用来解决:

    说.sh

    echo "$1 $V"
    

    结果

    bash$ export V=whatevs
    bash$ printf "%s\n" {0..3} | xargs -P 8 -n 1 ./say.sh
    1 whatevs
    2 whatevs
    0 whatevs
    3 whatevs
    

    【讨论】:

    • 这不允许我使用我在这个脚本中创建的变量。
    • 删除-0 参数允许xargs 使用\n 作为分隔符。
    • @NoviceC 您需要导出变量,因为通过 xargs 运行 parallel.sh 会阻止在定义变量的同一 shell 中运行它。
    • 啊,抱歉,我没有看到这是一个由两部分组成的问题。
    【解决方案4】:

    为了避免空格问题,我将使用换行符作为带有 -d 选项的 xargs 的分隔符:

    xargs -d '\n' ...
    

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 2018-11-13
      • 1970-01-01
      • 2015-06-28
      • 2011-07-18
      • 2013-04-22
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多