我正在使用类似 shell 函数zip0 () { zip -0rq "$1" "$1"; }
我想像这样将它与 xargs 一起使用。
$ seq 1 3 | xargs zip0
xargs: zip0: No such file or directory
但如错误消息所示,它未被识别为命令。我该如何使用xargs
shell 函数?
答案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.*'