我有以下脚本(在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回购中时,这不应该干扰。那么我在这里做错了什么?
答案 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)"