функция, которую вы ищете, - это wc
(количество слов) с параметром -l для подсчета строк (это буква l, а не цифра один).
Однако для этой задачи вам не нужна находка. Намного более простой способ сделать то, что вы хотите:
TotalDir=$( ls -1d */ | wc -l )
обратите внимание, что это номер один после ls
и буква l после wc
.
Изменить: Подводя итоги обсуждения в комментариях ниже, вот еще немного объяснений того, как работает это решение:
-1
указывает ls
использовать только один столбец, который гарантирует, что мы действительно получить по одной строке на подкаталог -d
сообщает ls
только список каталогов, а не их содержимое (просто попробуйте ls * / с параметром -d и без него, чтобы увидеть разницу. * /
сообщает ls
список всех каталогов ниже текущего. / path / to / ParentDirectory / * /
сообщает ls
список всех каталогов ниже / path / to / ParentDirectory /
wc -l
подсчитывает строки вывода команды ls
, которая - с параметрами, описанными выше - - это точное количество подкаталогов. Ваша проблема связана с цитированием.
По сути, вы устанавливаете переменную 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
}
Использовать оценку:
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
}
Использовать параметр ПОДСКАЗКА _КОМАНДА
alux@deb904:~$ PROMPT_COMMAND=pwd
/home/alux
alux@deb904:~$ cd /tmp
/tmp
alux@deb904:/tmp$
С вашей функцией:
$ PROMPT_COMMAND=GIT_BRANCH
Параметр 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 >
Значение PROMPT _COMMAND выполняется до отображения значения PS1. Таким образом, мы можем использовать КОМАНДУ PROMPT _для изменения 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 _:
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