. bash_profile функционируют выполненная операция на том же каталоге

функция, которую вы ищете, - это 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 , которая - с параметрами, описанными выше - - это точное количество подкаталогов.
0
10.07.2018, 16:02
4 ответа

Ваша проблема связана с цитированием.

По сути, вы устанавливаете переменную 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
28.01.2020, 02:42

Использовать оценку:

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
}
-1
28.01.2020, 02:42

Использовать параметр ПОДСКАЗКА _КОМАНДА

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

С вашей функцией:

$ PROMPT_COMMAND=GIT_BRANCH
0
28.01.2020, 02:42

Параметр 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
0
28.01.2020, 02:42

Теги

Похожие вопросы