【问题标题】:Capture output from git command?从 git 命令捕获输出?
【发布时间】:2012-11-22 19:23:59
【问题描述】:

我正在编写一个脚本来自动为我设置新项目。

这包括拉下一个 github 存储库。

我想做的是从我的脚本中得到一些输出,然后调用git clone $repo

我想在它运行时显示该命令的输出,但是当它运行时,如果它成功运行,则替换它的输出(注意只是 git 命令输出,我仍然希望之前的输出在那里) 使用repository successfully cloned,如果失败则将输出留在那里,然后打印repository cloning failed

我该怎么做?

以下是我当前(相当简单)的脚本。

#! /bin/bash

# -p project name

templateurl="git@bitbucket.org:xxx/xxx-site-template.git"

while getopts ":p:" opt; do #eventually I'll add more options here

case $opt in
  p)
    project=$OPTARG
    ;;
  \?)
    echo "Invalid option: -$OPTARG" >&2
    exit 1
    ;;
  :)
    echo "Option -$OPTARG requires an argument." >&2
    exit 1
    ;;
esac
done

if [ -z "$project" ]; then
    echo "Project name required"
    exit 1
fi

clear
echo "|==========================|"
echo "| New xxx Project Creator  |"
echo "|==========================|"
echo "Project: $project"

if [ -d "$project" ]; then
    echo "Directory $project already exists!"
    exit 1
fi


mkdir $project
if [ ! -d "$project" ]; then
    echo "Failed to create project directory!"
    exit 1
fi

echo "Cloning xxx Template repository"
git clone $templateurl $project

【问题讨论】:

    标签: bash capture output


    【解决方案1】:

    git clone 确实提供了一个可以用 $? 读取的退出代码?如下:

    git clone user@server:repo
    echo $?
    

    如果一切正常,这将打印 0。例如,如果该文件夹不是 git 存储库,您将获得退出代码 128。

    您可以检查克隆是否工作如下:

    git clone user@server:repo localrepo --quiet
    success=$?
    if [[ $success -eq 0 ]];
    then
        echo "Repository successfully cloned."
    else
        echo "Something went wrong!"
    fi
    

    --quiet将抑制 git 的任何输出,只要没有错误。因此,如果您只是删除 else-branch,您将获得积极的输出或 git 产生的错误。

    【讨论】:

    • 我已将脚本的底部更改为 git clone $templateurl $project --quiet success=$? if [[ success -eq 0 ]]; then echo "Repository successfully cloned." fi 但我在 if 语句的行中收到错误 [[: not found。另外,我认为我的问题有点被误解了,我仍然想在命令运行时显示正常输出,以便用户得到一些关于正在发生的事情的反馈。但我想在命令完成后清除该输出。
    • if 语句中缺少 $:[[ $success ...; 如果要删除已打印的输出,则必须处理回车符 (\r),然后覆盖旧输出。我认为删除已经打印的输出是不可能的。
    • 另一种可能性是使用 ANSI-Escape-Codes ascii-table.com/ansi-escape-sequences.php。例如echo -e "\033[2K" 删除活动行。设置光标位置和删除行的组合可能会成功。
    • 嗯,我想我可能只是将我想要保留的输出存储在一个变量中,然后继续使用clear; echo $progress的组合
    【解决方案2】:
    git clone user@server:repo localrepo > git.log 2>&1
    if [[ $? eq 0 ]];
    then
       echo Repository successfully cloned.
    else
       cat git.log
       echo Repository cloning failed.
    fi
    
    rm git.log
    

    说明:

    git clone user@server:repo localrepo > git.log 2>&1 将 stdout 和 stderr 流重定向到 git.log。 > git.log 将 stdout 重定向到 git.log 2>&1 将 stderr 重定向到与 stdout 相同的位置(因此,git.log)。

    $? eq 0 检查 git 的 retcode,如果克隆成功,则应该为 0。

    cat git.log 输出 git.log 文件的内容。

    【讨论】:

    • GITOUTPUT=`git clone user@server:repo localrepo` 不幸的是,不会抑制 git 的输出。即使git clone ... > /dev/null 也不会抑制任何输出。
    • 那么它一定是写到stderr。我会发布一个不同的答案。
    • git checkout 也进入标准错误(但 git pull 进入标准输出?)。这救了我!
    猜你喜欢
    • 2018-05-04
    • 2020-03-20
    • 2012-02-18
    • 2017-02-26
    • 2013-01-16
    • 1970-01-01
    • 2012-06-29
    • 2022-01-14
    相关资源
    最近更新 更多