Для объяснения, почему вы всегда принимаете ветвь 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
в двойных кавычках, поскольку его можно статически оценивать.