Bash Состояние выхода всегда не соответствует сравнению - PullRequest
0 голосов
/ 29 апреля 2020

В моем .bashr c ...

46 function exitstatus()
47 {
48  local a=0
49  local s=$1
50  s=$s+1
51  a=$a+1
52  echo -n ' arg1='$s' a='$a
53  s=$1
54  a=0
55  echo  ' arg1='$s' a='$a
56
57  if [[ "$s" = "$a" ]]; then
58      echo "true"
59  else
60      echo "false"
61  fi
62 }
63
64 function myprompt {
65  local        ss=\$?
66  unset PS1
67  PS1="exit:\$? var:$ss exitstatus $ss $(exitstatus $ss) \n\t $ "
68 }
69 myprompt

exitstatus всегда оценивается в false, даже если переменные s и a выглядят одинаково:

23:36:55 $ true
exit:0 var:0 exitstatus 0  arg1=0+1 a=0+1 arg1=0 a=0
false
23:36:56 $ false
exit:1 var:1 exitstatus 1  arg1=1+1 a=0+1 arg1=1 a=0
false

Строки 50 и 52 продемонстрировали мне, что s рассматривается как строка, поэтому я сравниваю ее как строку в строке 57. Сравнение работает, как и ожидалось, если я сравниваю s с собой или a для себя, потому что exitstatus всегда оценивается в true. По какой-то причине exit status $? в качестве аргумента для exitstatus не обрабатывается должным образом.

Чего мне не хватает?

1 Ответ

0 голосов
/ 29 апреля 2020

Поскольку вы определили PS1="..." в двойных кавычках, подоболочка $(exitstatus ...) оценивается только один раз при запуске оболочки. После этого результат этой оценки является буквальной частью вашей подсказки и больше не меняется.

Минимальный пример

В этом интерактивном сеансе оболочки я выполняю одну команду в секунду. date +%s печатает секунды текущего времени. Я использую true в качестве команды, потому что она ничего не печатает.

$ PS1="$(date +%s) "
23 true
23 true
23 PS1='$(date +%s) '
26 true
27 true

Как мы видим, с двойными кавычками подоболочка вычисляется только один раз, тогда как с одинарными кавычками подоболочка раскрывается каждый раз при выводе приглашения. Конечно, вы также можете написать PS1="\$(date +%s) " в запрос на обновление.

...