gpt4 book ai didi

bash - 在 find + xargs grep 中得到退出代码 123

转载 作者:行者123 更新时间:2023-11-29 09:38:10 25 4
gpt4 key购买 nike

这是我的脚本

eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep  -f <(echo "stdio")
echo $?

未找到任何内容,退出代码为 123。

如果我稍微修改如下

echo "stdio" >.P
eval "find \\( -type f -a \\( -name '*.h' \\) \\) -print0" | xargs -0 -n100 grep <.P
echo $?

找到了一些东西,但退出代码仍然是 123。

其实我只是想写一个小脚本让find+xargs+grep更简单。例如,

xgrep -e PATTERN1 -e PATTERN2 ... *.c *.h

就是执行

find -name *.c -o -name *.h | xargs grep -f <(echo "$PATTEN1
$PATTERN2")

使用 -f 选项而不是 -e 是为了避免在模式中转义单引号或双引号时出现问题。

#!/bin/bash
#set -e -o pipefail

eval ARGV=($(getopt -l '' -o 'e:li' -- "$@")) || exit 1
for((i=0;i<${#ARGV[@]};i++)) {
o="${ARGV[$i]}"
case $o in
-e)
i=$((i+1));
a="${ARGV[$i]}"
if [ -n "$grep_patterns" ]; then
grep_patterns="$grep_patterns"$'\n'
fi
grep_patterns="$grep_patterns$a"
;;
-i)
grep_options="$grep_options -i"
;;
-l)
grep_options="$grep_options -l"
;;
--)
i=$((i+1));
break;;
esac
}

for((;i<${#ARGV[@]};i++)) {
if [ -n "$find_options" ]; then
find_options="$find_options -o "
fi
find_options="${find_options}-name '${ARGV[$i]}'"
}

cmd="find \\( -type f -a \\( $find_options \\) \\) -print0"
eval "$cmd" | xargs -0 grep $grep_options -f <(echo "$grep_patterns")

最佳答案

123 表示“任何以非零状态退出的调用”。所以 xargs 至少运行了两次 grep(因为你给它提供了太多的文件,以至于它们会超过最大命令行长度,你限制为 100 个文件)并且至少有一个调用是针对一组不包含匹配项的文件,这导致 grep 的退出代码为非零(失败)。

也许您应该解释一下您要完成的任务。 eval 看起来多余,双重重定向可能无法完成您想要的(grep 的标准输入不能同时连接到来自 eval 的管道> 和 .P)。

如果你想参数化 grep 的第一个参数,可以做类似的事情

#!/bin/sh
find -type f -name '*.h' -print0 |
xargs -0 -n100 grep "$1"

... 你在哪里调用它,例如stdio 作为第一个参数。

(还请注意 find 的参数大大简化。您只有两个谓词,因此无需括号,然后可以删除 -a,也是。)

如果 grep 调用返回零匹配,则退出代码仍为 123。您可以通过省略 -n 100(这似乎几乎没有任何有用的用途)来减少这种可能性,但如果您想绝对防止它,您可以将整个管道提供给 | grep . 如果有任何输出,它将报告成功。 (或者你可以在包装器上运行 xargs 如果 grep 的退出代码是 0 或 1,它总是返回成功,但那更复杂,然后你会看到即使在零匹配的情况下也“成功”。)

关于bash - 在 find + xargs grep 中得到退出代码 123,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26540813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com