bash, если «$ 1» == «0» всегда ложно при запуске функции для приглашения bash - PullRequest
0 голосов
/ 03 марта 2020

Я долго боролся с этим. Попытка изменить цвет как часть моего приглашения в зависимости от кода завершения последней команды.

Я уменьшил свое приглашение до минимального примера:

Red="\[\033[31m\]"
Green="\[\033[32m\]"
Reset="\[\033[0m\]"

statColour(){
    if [[ "$1" == "0" ]]; then
        echo -e "${Green} $1 "
    else
        echo -e "${Red} $1 "
    fi
}

export PS1="$(statColour \$?)What Colour? $Reset"

И в результате красный всегда отображается используется несмотря на то, что в первом случае число явно равно 0.

enter image description here

Я пробовал [ и $1 -eq 0 безуспешно. Почему это не работает?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Попробуйте:

Red="\033[35m"
Green="\033[32m"
Reset="\033[0m"

statColour(){
    if [[ $1 = 0 ]]; then
        echo -e "${Green} $1 "
    else
        echo -e "${Red} $1 "
    fi
}

export PS1="\$(statColour \$?)What Colour? $Reset"
#           ^
  1. Изменены определения цветов
  2. Вызов statColour теперь выполняется каждый раз, а не только один раз.
  3. if [[ ]] оптимизировано
0 голосов
/ 03 марта 2020

Для объяснения, почему вы всегда принимаете ветвь false :

Вы звоните statColour с \$? в качестве аргумента. Backsla sh гарантирует, что $ воспринимается буквально (а не как начало расширения параметра), поэтому вы фактически получаете буквальную строку $?. Поскольку ? является подстановочным знаком, он генерирует имя файла, то есть параметр заменяется всеми файлами, имя которых равно $, за которым следует один символ. Если в вашем каталоге нет таких файлов (что, вероятно, и есть), строка $? передается буквально в statColour.

Внутри statColour, вы написали

[[ "$1" == "0" ]]

это означает, что вы спрашиваете, равна ли строка $? строке 0. Это никогда не так, поэтому сравнение всегда ложно.

Для вашей проблемы вы можете попробовать этот подход (не проверенный, поэтому вам, возможно, придется немного его отладить):

statColour() {
  # Fetch the exit code of the last program
  local last_exit_code=$?
  if ((last_exit_code == 0)) # Numeric comparision
  then
    .....
  else
    ...
  fi
  # Preserve the exit code
  return $last_exit_code
} 

и задайте для приглашения

PS1='$(statColour) '"$Reset"

Одинарные кавычки гарантируют, что statColour оценивается динамически, тогда как $Reset в двойных кавычках, поскольку его можно статически оценивать.

...