git status在脚本

时间:2017-06-28 19:50:02

标签: git bash shell

我有以下脚本(在shellcheck.net中没有返回任何错误):

#! /bin/bash

function git_info {
  local git_status
  git_status="$(git status 2> /dev/null)"

  echo "$git_status" #returns new line
}

git_status没有设置,或者更确切地说,它获得了一个空白值。此函数正在每个bash命令上运行。下面是控制台的样子。

local:~$

local:~$ git status
fatal: Not a git repository (or any of the parent directories): .git

local:~$ cd projects/testdir/

local:~/p/testdir$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

local:~/p/testdir$

每个local:~$之前的那些空行是函数回显的位置。 输出您在运行git status时可以看到的内容。

在每个命令上运行此函数的代码位于.bash_profile中,如下所示:

source "$HOME/bin/testll.sh" # this is the file with git_info 

PS1="$(git_info)"           # prints current branch
PS1+="\[$COLOR_WHITE\]:\[$COLOR_BLUE\]\$(truncate)" # directory path
PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\] "   # '#' for root, else '$'
export PS1

显然这应该是基于git状态改变我的提示,但是我已经将问题缩小到git状态,但是为了提出一个MCVE,我只会这样做显示代码。如果您因任何原因需要查看更多内容,我可以将其添加到此问题中。

我知道2>/dev/null应该返回一个空字符串或空值或其他错误,因此当git status输出fatal: not a git repo...消息时,这是预期的。但是当我在git回购中时,这不应该干扰。那么我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

感谢Raman Sailopal建议使用-x运行调试程序,我发现问题是由.bash_profile中的这一行引起的:

PS1="$(git_info)"

应该是

PS1="\$(git_info)"

我不知道为什么逃避美元符号有所不同,但它导致该功能在此过程中稍后运行,这使得git status不会导致错误。

另外,逃离美元符号也会导致回声字符串的某些部分按字面意思回显。它没有在我的问题中显示,但我回应了颜色,并且该语法的部分显示出来,给了我\]local:~$。当我从字符串中删除这些字符时,它仍然有效,我不知道为什么逃避$允许这种情况,但事实确实如此。

简而言之,转义函数会导致稍后在进程中调用它(可能)允许正确设置子shell上下文,从而允许git status不出错并将输出转储到{{1} }。

答案 1 :(得分:0)

您的代码似乎没问题。

但是你正在使用echo,它总是在回显的内容上添加换行符。请避免此行为,只需使用-n参数。

echo -n "$git_status"

答案 2 :(得分:0)

也许你想捕获stderr

git_status="$(git status 2>&1)"

而不是

git_status="$(git status 2> /dev/null)"

并且没有重定向stderr将直接显示在tty中(从父进程继承的fd2):

git_status="$(git status)"