私の.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
}