带有 shell 功能的 xargs 不起作用

带有 shell 功能的 xargs 不起作用

我正在使用类似 shell 函数zip0 () { zip -0rq "$1" "$1"; }

我想像这样将它与 xargs 一起使用。

$ seq 1 3 | xargs zip0
xargs: zip0: No such file or directory

但如错误消息所示,它未被识别为命令。我该如何使用xargsshell 函数?

答案1

你必须让 xargs 调用 shell:

seq 1 3 | xargs sh -c "zip0 () { zip -0rq "$1" "$1"; }; zip0"

答案2

您可以通过导出它并使用子进程(bash)调用它来使它(fn)可见:

注意 “{}”评论中提到的用法。我需要它,而且它处于受控环境中。

在我的场景中,我无法在文件中编写辅助 bash 脚本,因为这会被发送到具有只读 fs 的远程主机。因此函数会有所帮助。我将一个文字 bash 脚本发送到 ssh 命令,其中包含函数,导出它们,然后运行命令,将输出通过管道传输到 xargs 并使用调用函数bash -c

17:19:07-me@dsk:~/tests$ cat /tmp/bashtest && /tmp/bashtest
01: function decompressAndGrep () {
02:   echo "Juan"
03:   echo "$(echo $zstdCmd -dc $1) | grep -m3 -A20 -i '\[ERROR\].*customer.*'"
04: }
05: export -f decompressAndGrep
06: decompressAndGrep "Pepe" 
07: find ./ -name '*.zst' | head -n1 | xargs -n 1 -P 4 -I {} /bin/bash -c "decompressAndGrep {}"

## Output:

# Inner Call (line 06)
Juan
-dc Pepe | grep -m3 -A20 -i '\[ERROR\].*customer.*'

# xargs Call (line 07) see `-I {}` and it's use later "decompressAndGrep {}"
Juan
-dc ./juan.zst | grep -m3 -A20 -i '\[ERROR\].*customer.*'

相关内容