LINUX.ORG.RU

bash. 'if' затирает значение '$?'


0

1

привет.

такой код:


function func_set_error {
	# $1 - error code
	return $1
}

$(func_set_error 2)
if [ $? != 0 ]; then
	echo "1: $?"
fi

$(func_set_error 3)
if [[ $? != 0 ]]; then
	echo "2: $?"
fi
выведет такое:
1: 0
2: 0
хотя, по идее, операторы не должны изменять last_error_code.

т.е. я ожидаю, что вывод должен быть таким:

1: 2
2: 3
я что-то не правильно понимаю?

благодарен.

★★★

Вот этот код:

$(func_set_error 2)

Выполнит функцию func_set_error в отдельном процессе, а после выполнит её выхлоп.

Функции выполняются просто по имени:

derlaft@odd:~$ f() { return 2; }
derlaft@odd:~$ f
derlaft@odd:~$ if [ "$?" -eq 2 ]; then echo lol; fi
lol
derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от derlafff

Выполнит функцию func_set_error в отдельном процессе

да, но сути это не меняет. значение '$?' в любом случае должно быть таким, какое я указал в аргументе.

этот код все равно выводит нули:


function func_set_error {
	# $1 - error code
	return $1
}

func_set_error 2
if [ $? != 0 ]; then
	echo "1: $?"
fi

func_set_error 3
if [[ $? != 0 ]]; then
	echo "2: $?"
fi

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Загоняй $? в переменную, операция сравнения действительно его затирает, ибо он в ней активно используется

function func_set_error {
        # $1 - error code
        return $1
}

func_set_error 2

err=$?

if [[ $err -ne 0 ]]; then
  echo "1: $err"
fi

func_set_error 3

err=$?

if [[ $err -ne 0 ]]; then
  echo "2: $err"
fi
derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)

затирает не if, а test или [/[[.

at ★★
()

хотя, по идее, операторы не должны изменять last_error_code.
я что-то не правильно понимаю?

Да, ты неправиьно понимаешь основную концепцию bash.
В нём нет операторов. if - хоть и встроенная, но такая же команда, как и все остальные, имеющая свой код возврата (и, следовательно, меняющая его в процессе исполнения), допускающая перенаправление ввода/вывода, и т.д. То же справедливо и для циклов.

ABW ★★★★★
()
Ответ на: комментарий от derlafff

Загоняй $? в переменную

как лечить - я понял. я хотел услышать мнение других людей об этом, чтоб удостоверится что это нормальное поведение.

в общем я так понял, что такое поведение для баша - норма.

всем спасибо. вопрос закрыт.

niXman ★★★
() автор топика
Ответ на: комментарий от ABW

понял. не думал я что в баше нет операторов..

niXman ★★★
() автор топика

[ это отдельный бинарник, осёл.

anonymous
()
Ответ на: комментарий от ABW

if - хоть и встроенная, но такая же команда, как и все остальные, имеющая свой код возврата

Ничего подобного, код возврата имеет test aka [.

[ это отдельный бинарник, осёл

Который в баше по умолчанию заменяется встроенным вариантом, балбес.

redgremlin ★★★★★
()

хотя, по идее, операторы не должны изменять last_error_code

Они и не меняют. man bash

if список; then список; [ elif список; then список; ] ... [ else список; ] fi
Выполняется список после if. Если его статус выхода - 0, выполняется список после then.


После if идет просто набор команд и, в качестве условия, берется статус ($?) последней команды. Естественно, что then echo $? выведет 0, иначе бы if не вошло бы в этот блок then.

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
Ответ на: комментарий от redgremlin

вот теперь понял. спасибо.

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.