【问题标题】:Filtering GNU split with a custom shell function使用自定义 shell 函数过滤 GNU 拆分
【发布时间】:2018-06-25 11:08:19
【问题描述】:

有没有办法将 GNU split --filter 与自定义 shell 函数一起使用,例如

my_func () {
  echo $1
}
split -d 10 INPUT_FILE chunk_ --filter="my_func $FILE$"

我希望输出的

chunk_00
chunk_01
...

当然,自定义函数中的回声只是为了在这里表达我的问题,在我的具体情况下,自定义函数创建了一个脚本,该脚本使用来自拆分的块作为输入。

似乎 GNU shell 只接受 --filter 内的标准 shell 命令。

有什么聪明的办法吗?

【问题讨论】:

  • 命令split -d INPUT_FILE chunk_ 输出预期的文件格式。我不清楚您是想使用--filter 修改文件名还是想对每个块执行一些操作。在这两种情况下,请更新您的问题。
  • 只需将您的函数放入脚本中即可。
  • 真正的函数执行构建一个shell脚本,其中块用作另一个命令的参数。
  • 如果我将函数放入脚本中,我将需要更新 PATH,这会破坏我试图实现的易用性。
  • 您可以在 filter 参数中为命令添加相对路径或绝对路径的前缀。无需更新PATH。即--filter="/some/path/my_func.sh $FILE" 工作得很好。

标签: bash split


【解决方案1】:

您可以通过将函数导出到环境来做到这一点,该环境可供 split 运行的子 shell 使用。以 bash 为例:

ex.sh

#!/bin/bash

my_func() {
  echo $1
}

export -f my_func

seq inf | split -d --filter='my_func $FILE' /dev/stdin chunk_

如果你这样运行它:

bash ex.sh | head

输出是:

chunk_00
chunk_01
chunk_02
chunk_03
chunk_04
chunk_05
chunk_06
chunk_07
chunk_08
chunk_09

更多详情请参阅 UL 上的this answer

注意split 使用任何SHELL 变量设置为子shell 来运行--filter 命令。如果您运行的是不同的 shell,您可能需要在运行 split 之前添加 export SHELL=/bin/bash

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多