14个版本

0.1.14 2024年1月12日
0.1.12 2023年4月12日
0.1.11 2022年12月24日
0.1.8 2022年9月20日
0.1.2 2021年4月30日

#69并发

Download history 6/week @ 2024-05-21 6/week @ 2024-07-02

每月 73 次下载

MIT 许可证

17KB
320

parallel-sh

Crates.io CI GitHub license

parallel-sh 受Rust Parallel (parallel) 启发,并行化 '其他非并行命令行任务'。但 parallel-sh 不再尝试重造GNU Parallel的全功能,它将简单地以平台首选的shell(默认为Unix系统上的'sh -c',Windows上的'powershell.exe -c')在单独的线程中执行(命令的)行。

预期内容

  • 每个子进程的输出(stdout和stderr)仅在子进程退出后存储和打印。
  • 有一些简单的日志记录和一些运行时指标(通过-v, -vv或-vvv)可用。
  • 整个crate很小,<400行代码(大部分是命令行参数解析),并且可以快速修改以满足更复杂的要求。

parallel-sh 不包含的内容

  • 没有替换字符串(例如 '{}') 或输入令牌。命令将按提供的参数、文件或通过stdin提供的方式执行。
  • 命令来源不会'链接'。参数将通过 首选项 处理
    1. 如果找到 ARGS,则忽略 --file 选项和stdin。
    2. 如果提供 --file,则忽略stdin上的任何内容。
    3. 只有当没有命令参数且没有找到 '--file' 选项时,stdin上的任何行才被视为要执行的命令。
  • stdin不会从父进程继承,并且子进程尝试从stdin流中读取的任何尝试都将导致流立即关闭。但只要您的shell提供该功能,您就可以在每个线程中使用管道、重定向等,例如 parallel-sh 'ls -1 |wc -lparallel-sh.exe "Get-ChildItem -Path * | Measure-Object -Line"

这些特性的大部分效果可以通过在将命令传递给 parallel-sh 之前处理命令来实现。

选项

parallel-sh 0.1.14
Execute commands in parallel

Usage: parallel-sh [OPTIONS] [clijobs]...

Arguments:
  [clijobs]...

Options:
  -q, --quiet           Do not print `parallel-sh` warnings
  -n, --dry-run         Perform a trial run, only print what would be done (with -vv)
  -v, --verbose...      Sets the level of verbosity
  -l, --log <FILE>      Log output to file
      --halt-on-error   Stop execution if an error occurs in any thread
  -j, --jobs <THREADS>  Number of parallel executions
  -s, --shell <SHELL>   Shell to use for command execution. Must support '-c' (defaults to sh)
      --no-shell        Do not pass commands through a shell, but execute them directly
  -f, --file <FILE>     Read commands from file (one command per line)
  -h, --help            Print help
  -V, --version         Print version

注意

默认情况下,命令通过 -c "command" 执行,因此提供的shell必须支持 '-c' 选项。

使用 --no-shell 时,命令将在不通过shell传递的情况下启动。这可以避免在每个线程中启动shell的开销,但您将丢失诸如引号、转义字符、单词拆分、通配符模式、变量替换等特性。

命令继承 parallel-sh 的工作目录。

优先级

  1. 将命令作为参数传递

    parallel-sh "sleep 2 && echo first" "sleep 1 && echo second"
    
  2. 传递包含每行一个命令(-line)的文件

    parallel-sh -f /tmp/commands
    
    $ cat /tmp/commands
    sleep 2 && echo first
    sleep 1 && echo second
    
  3. 通过stdin传递命令

    echo -e 'sleep 2 && echo first\nsleep 1 && echo second' |parallel-sh
    

依赖关系

~2–10MB
~90K SLoC