首页 > 解决方案 > 如何在隐藏命令的同时读取命令输出?

问题描述

我有一个自定义 Git 命令,它有条件地删除具有远程功能的本地分支:

#!/usr/bin/env bash

GONE_BRANCHES=$(git branch -vv | grep 'origin/.*: gone]' | awk '{print $1}')

if [ -z "$GONE_BRANCHES" ]; then
  echo "Could not find any local branches that have a gone remote"
  exit 0
fi

if [ "$1" = "-f" ]; then
  echo "$GONE_BRANCHES" | xargs git branch -D
else
  echo "$GONE_BRANCHES" | xargs git branch -d 2>/dev/null
  if [ $? -eq 1 ]; then
    FAILED_TO_DELETE="true"
  fi
fi

if [ "$FAILED_TO_DELETE" = "true" ]; then
  echo "error: Some local branches are not fully merged."
  echo "If you are sure you want to delete them, run 'git-glean -f'"
fi

根据对这个问题的回答,我正在尝试构建一个仍然输出结果的解决方案git branch -d,但如果它无法删除,则吞下(隐藏)错误消息并回显自定义错误消息。

问题是条件错误消息永远不会触发(对于那些无法用 删除的分支git branch -d)。

标签: bashgiterror-handling

解决方案


xargs手册页中,它指出:

EXIT STATUS
xargs 以以下状态退出:
0 如果成功
123 如果命令的任何调用以状态 1-125 退出

1"如果进程以 1 状态退出,Xargs 将不会以状态退出。将您的条件更改为:

 echo "$GONE_BRANCHES" | xargs git branch -d 2>/dev/null
 if [ $? -ne 0 ]; then

推荐阅读