Bash 带read的函数定义正在阻塞shell

Bash 带read的函数定义正在阻塞shell,bash,shell,Bash,Shell,我试图在Bash中使用以下函数定义来设置会话智能git环境变量。如果我源代码这个,我的Bash块,我只能用CTRL+D来kil它,然后我得到了一个不可用的shell(不可能有命令)。我猜,是因为读卡了。原始版本中甚至有一个“while-true;do”,但这对CPU造成了更严重的破坏。 因此,出现了两个问题: 我如何才能达到让此功能正常工作的目标 为什么只定义函数而不调用函数时会出现问题 function git() { echo "Running BETTER git..."

我试图在Bash中使用以下函数定义来设置会话智能git环境变量。如果我源代码这个,我的Bash块,我只能用CTRL+D来kil它,然后我得到了一个不可用的shell(不可能有命令)。我猜,是因为读卡了。原始版本中甚至有一个“while-true;do”,但这对CPU造成了更严重的破坏。 因此,出现了两个问题:

  • 我如何才能达到让此功能正常工作的目标
  • 为什么只定义函数而不调用函数时会出现问题

    function git() {
        echo "Running BETTER git..."
        if [ -z "$GIT_COMMITTER_NAME" ]; then
            echo -n "Git User: "
            read -e UNAME
            if [ "$UNAME" == "user1" ] -o [ "$UNAME" == "user2" ]; then
                echo "Hello $UNAME, you will be set as committer for this git session"
            else
                echo "Invalid User"
            fi
            GIT_COMMITTER_NAME=$UNAME
            export GIT_COMMITTER_NAME
            GIT_COMMITTER_EMAIL=$UNAME@company.com
            export GIT_COMMITTER_EMAIL
            GIT_AUTHOR_NAME=$GIT_COMMITTER_NAME
            export GIT_AUTHOR_NAME
            GIT_AUTHOR_EMAIL=$GIT_COMMITTER_EMAIL
            export GIT_AUTHOR_EMAIL
        fi
        echo "  using git user: $GIT_AUTHOR_NAME / $GIT_AUTHOR_EMAIL"
        /usr/bin/git "$@"
    }
    

  • 仅仅问第二个问题就让我找到了问题的根源:为什么函数的定义会带来麻烦?因为git实际上是在我的环境中调用的: 改变

    进入

    他正在解决这个问题。 bash中的每个命令都会对$PS1求值,因此在每次提示时,都会发出git命令,从而调用我定义的函数


    编辑:我还必须在my/etc/bash_completion.d/git-prompt中将所有出现的“git”替换为“/usr/bin/git”。现在我可以用这个函数来别名“git”,它可以正常工作。

    无法重现。您还有一个语法错误:
    如果[“$UNAME”=user1]| |[“$UNAME”=user2]
    -o
    是一个(过时的)运算符,用于
    […]
    内部。但是,考虑是否有<代码> Git < /代码>提示每个命令的名称是一个好主意。特别是,这些都不适用于每次显示提示时都试图运行的
    git branch
    。是的,当某些内容不可复制时,通常是用户的环境,在我的情况下,这是问题的根源(请参见下面我自己的答案)。感谢指向错误语法的指针,chepner。我之所以需要会话智能用户设置,关键是我们需要与技术用户一起进行回购,我们需要更容易地识别提交用户。一次会话只能调用一次脚本(之后,将导出环境变量)。此外,您还有一个策略问题,而不是技术问题。如果我不信任用户在运行
    git
    之前正确配置他们的环境,我就不会信任他们使用这个函数,这个函数很容易被绕过:用户可以直接运行
    命令git
    /usr/bin/git
    ,或者用户可以给
    git\u committer\u NAME
    任何伪造的非空值。另一个错误:无论输入的名称是否有效,您仍然可以使用它来设置其他环境变量的值。您也可以在提示中使用
    /usr/bin/git
    。这将执行二进制文件,而不是函数。
    export PS1=$Color_Off'$(git branch &>/dev/null;\
    
    export PS1=$Color_Off'$(/usr/bin/git branch &>/dev/null;\