.bash_profile関数は、同じファイルディレクトリでジョブを実行します。

.bash_profile関数は、同じファイルディレクトリでジョブを実行します。

私の.bash_profileには次の機能があります。

function GIT_BRANCH() {

    STATUS="\$(git status 2> /dev/null)";

    if [[ ! ${STATUS} ]]; then
            if [[ ! ${STATUS} = *"working tree clean"* ]]; then
                    echo "not clean repo";
            else
                    echo "clean repo";
            fi
    else
            echo "not a repo";
    fi

}

次のようにコマンドを実行すると:

echo $(git status 2> /dev/null);
echo $(pwd);

残念ながら、現在のシェルにあるディレクトリではコマンドは実行されません。

以下の例に従って問題を解決しようとしています。

STATUS="\$(git status 2> /dev/null)";

変数を出力するためにechoを使用する限り、これはうまくいきます。正しく理解すると、文字列だけが変数に格納され、比較するとコマンドは実行されません。 STATUSに格納されているコマンドの戻り値を取得し、同じシェルでコマンドを実行するにはどうすればよいですか?

編集する:

私はPS1でこの機能を使用しています。私が試した場合:

function GIT_BRANCH() {
    STATUS="\$(git status 2> /dev/null)";
    echo ${STATUS};
    TEST="\$(pwd)";
    echo ${TEST};
}

export PS1="$(COLOR "199")\u$RESET_ALL$(COLOR "45") \h \w$RESET_ALL $(COLOR "199")$(GIT_BRANCH $DIRE)$RESET_ALL\n$(COLOR "199")$ >$RESET_ALL "

その後、すべてがうまく機能し、現在のディレクトリを取得します。ただし、この情報を関数自体で使用しようとすると、以前に公開した例のようには機能しません。

助けてくれてありがとう。

答え1

問題は引用符にあります。

デフォルトでは、PS1変数を次のように設定します。

PS1="$(myfunction)"

PS1現在はシェルでのみ使用しているため、エクスポートは不要です。)

この関数myfunctionはに割り当てられたときに呼び出され、PS1関数は再び呼び出されません。

代わりに、次を使用する必要があります。

PS1='$(myfunction)'

myfunctionこれにより、プロンプトが表示されるたびに呼び出されます。

関数自体に特別な参照は必要ありません。


あなたの機能:

function GIT_BRANCH() {

    STATUS="\$(git status 2> /dev/null)";

    if [[ ! ${STATUS} ]]; then
            if [[ ! ${STATUS} = *"working tree clean"* ]]; then
                    echo "not clean repo";
            else
                    echo "clean repo";
            fi
    else
            echo "not a repo";
    fi

}

これは次のように書き直すことができます。

GIT_BRANCH () {
    local status="$( git status --porcelain 2>&1 )"

    case "$status" in
        *"fatal: not a git repository"*)
            echo 'Not a repo' ;;
        "")
            echo 'Clean repo' ;;
        *)
            echo 'Not clean repo' ;;
    esac
}

または、if次の文を使用します。

GIT_BRANCH () {
    local status="$( git status --porcelain 2>&1 )"

    if [[ "$status" == *"fatal: not a git repository"* ]]; then
        echo 'Not a repo'
    elif [[ -z "$status" ]]; then
        echo 'Clean repo'
    else
        echo 'Not clean repo'
    fi
}

答え2

PROMPT_COMMANDパラメータの使用

alux@deb904:~$ PROMPT_COMMAND=pwd
/home/alux
alux@deb904:~$ cd /tmp
/tmp
alux@deb904:/tmp$

あなたの機能として:

$ PROMPT_COMMAND=GIT_BRANCH

答え3

パラメータPS1は、バックスラッシュでエスケープされた複数の特殊文字(\u、\d、\$、...)を挿入してカスタマイズできる静的文字列です。これらのラベルだけが動的です。

alux@deb904:~$ echo $PS1
\u@\h:\w\$
alux@deb904:~$ ps1="$PS1"

PS1がコマンド(PS1 = $(pwd)またはPS1 = `pwd`)を使用して評価されると、PS1はコマンドリターンとして評価されます。

alux@deb904:~$ PS1="$(pwd) > "
/home/alux > echo $PS1
/home/alux >
/home/alux > cd /tmp
/home/alux > echo $PS1
/home/alux >
/home/alux > pwd
/tmp

PROMPT_COMMANDパラメータにPS1の値を表示する前に、実行されたコマンドラインが含まれていることを確認できます。関数を使用する方が適切です。

/home/alux > PS1=$ps1
alux@deb904:~$ myprompt(){ pwd; echo " > "; }
alux@deb904:~$ COMMAND_PROMPT=myprompt
/home/alux
>
alux@deb904:~$

この行に戻りたくない場合は、echo -nを使用してください。

/home/alux
>
alux@deb904:~$ myprompt(){ echo -n "$(pwd) > "; }
/home/alux > alux@deb904:~$ cd /tmp
/tmp > alux@deb904:/tmp$

PS1の値を削除できます。

/tmp > alux@deb904:/tmp$PS1=
/tmp >

ただし、バックスラッシュからエスケープされた特殊文字はありません。

/tmp >  myprompt(){ echo -n "$(pwd) \u \h  > "; }
/tmp \u \h >

その後、他のパラメータ($ USER、$ HOSTNAME、...)を使用できます。

/tmp \u \h >  myprompt(){ echo -n "$(pwd) $USER $HOSTNAME  > "; }
/tmp alux deb906 >

PS1 値が表示される前に PROMPT_COMMAND 値が実行されます。したがって、PROMPT_COMMANDを使用してPS1を変更できます。

/tmp alux deb906  > myprompt(){ PS1=$(echo -n "$(pwd) (\h) > "); }
/tmp (deb904) > echo $PS1
/tmp (deb904) >
/tmp (deb904) > cd ~
/home/alux (deb904) > echo $PS1
/home/alux (deb904) >
/home/alux (deb904) > PROMPT_COMMAND=
/home/alux (deb904) > PS1=$ps1
alux@deb904:~$ 

これで.bash_profileから:

function GIT_BRANCH() {
  local status="$(git status 2> /dev/null)"
  local msg
  if [ "${status}" ]; then
        if [ ! "${status}" = *"working tree clean"* ]; then
                msg="not clean repo"
        else
                msg="clean repo"
        fi
  else
        msg="not a repo"
  fi
  PS1="\u \h \w ${msg}\n\$ "
}
PROMPT_COMMAND=GIT_BRANCH

答え4

使用評価:

function GIT_BRANCH() {

  STATUS="\$(git status 2> /dev/null)";

  if [ "$(eval echo ${STATUS})" ]; then

        if [ ! $(eval echo ${STATUS}) = *"working tree clean"* ]; then
                echo "not clean repo";
        else
                echo "clean repo";
        fi
  else
        echo "not a repo";
  fi

}

または別の追加機能:

function STATUS(){
  git status 2> /dev/null
}
function GIT_BRANCH() {
  if [ "$(STATUS)" ]; then
  fi
}

関連情報