如何有效地检查任意命令是否在POSIX shell中产生任何输出? (假设 git ls-files --killed
。)
有三种显而易见的方式,但每种方式对我来说都是丑陋或邪恶的:
答案 0 :(得分:4)
您也可以检查命令的退出状态。通常,如果成功运行命令,则返回退出状态0。
git ls-files --killed > /dev/null
if [ $? -eq 0 ]
或者如果您只想依赖命令的输出,可以使用“head -1
”和第一个选项,因为无论如何它看起来除了知道之外你没有使用命令输出进行任何处理结果。
答案 1 :(得分:3)
我首选的解决方案使用内置read
def cube(number):
return number * number
def by_three(number):
if number % 3 == 0:
print("{} is divisible by 3".format(number))
return cube(number)
else:
print("Nope")
return False
def main():
by_three(3)
by_three(4)
if __name__ == "__main__": main()
if git ls-files --killed | read REPLY; then
echo "Some output"
else
echo "No output or git failed"
fi
尝试从stdin读取一行(并进入变量read
),如果成功则返回0,如果失败则返回正退出代码。管道的其余部分未读取。仅在bash中,REPLY
是默认名称(如果省略),因此REPLY
可以缩短为read REPLY
。
这种方法的一个潜在缺点是,不会检查相关程序的退出代码(在您的示例中为git)。
答案 2 :(得分:1)
您可能认为此解决方案与其他解决方案一样,但我认为它使用的内存少于其他解决方案(我不是shell脚本效率方面的专家)。
代码仅限bash:
z=0
while read -r -n1 char; do
z=1
break
done < <(git ls-files --killed)
[ $z != 0 ]
它使用临时变量而不是临时文件,我认为read一次只能运行一个char,但git ls-files命令仍然可以完全执行。
它可能不会那么难看,但我认为它可能至少更有效率。
答案 3 :(得分:-1)
因为你提到了POSIX,我会推荐你这个answer
我会使用/ usr / bin / test,因为它在POSIX系统上是必需的。
/usr/bin/test -n "$(git ls-files --killed)"