【问题标题】:git status returning newline in scriptgit status 在脚本中返回换行符
【发布时间】:2017-06-28 19:50:01
【问题描述】:

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

【问题讨论】:

  • 使用 bash -x 运行代码。这将使您能够更好地跟踪变量。

标签: git bash shell


【解决方案1】:

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

PS1="$(git_info)"

应该是的

PS1="\$(git_info)"

我不知道为什么转义美元符号会有所不同,但它会导致函数在该过程的后期运行,这使得git status 不会导致错误。

顺便说一句,转义美元符号也会导致回显字符串的某些部分被逐字回显。我的问题中没有显示它,但我正在呼应颜色,并且出现了该语法的一部分,给了我\]local:~$。当我从字符串中删除这些字符时,它仍然有效,我不知道为什么转义 $ 允许出现这种情况,但确实如此。


简而言之,转义函数导致它在进程的后期被调用,这(可能)允许正确设置子shell上下文,从而允许git status不出错并将输出转储到/dev/null

【讨论】:

    【解决方案2】:

    您的代码看起来不错。

    但是您使用的是echo,它总是在回显的内容中添加一个换行符。请避免这种行为,只需使用-n 参数即可。

    echo -n "$git_status"
    

    【讨论】:

      【解决方案3】:

      也许你也想捕获标准错误

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

      而不是

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

      并且不重定向stderr会直接显示在tty中(fd2继承自父进程):

      git_status="$(git status)"
      

      【讨论】:

        猜你喜欢
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 2013-04-11
        • 2013-05-26
        • 2011-07-28
        • 2015-12-09
        相关资源
        最近更新 更多