LINUX.ORG.RU

bash. почему использование 'local' затирает значение '$?' ?


0

1

привет.

обнаружил такую странность..

следующий код(директории /123 не существует) выводит 0:

function func {
	local str=$(cd /123 && echo ok)
	local rc=$?
	echo "rc: $rc"
}
func
вывод:
cd: /123: No such file or directory
rc: 0

теперь изменяем этот код так, и получаем что ожидаем:

function func {
	str=$(cd /123 && echo ok)
	local rc=$?
	echo "rc: $rc"
}
func
вывод:
cd: /123: No such file or directory
rc: 1

вопрос всего один - почему?

благодарен.

★★★

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

в похожей моей теме(bash. 'if' затирает значение '$?') я получил внятное объяснение происходящего:

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

хотелось бы и в данном вопросе получить объяснение не хуже, почему 'local' затирает '$?' ? я не нашел программы 'local', и не думал что найду ибо 'local', как мне кажется, не может быть программой. к тому же, хотелось бы понять, как работает 'local', а не что выполняет.

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

частично ответ найден тут: http://stackoverflow.com/questions/4421257/should-local-keyword-sweep-return-...

непривычно то, что но моцг мне говорит что 'local' это не оператор и не программа, это ключевое слово, я бы сказал - спецификатор.

все равно не понятно как он работает, и зачем ему код возврата?

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

Потому что 'local' - команда, которая так же имеет свой код возврата, ненулевой, например, если пытаешься переопределить переменную «только для чтения».
Для присваивания правила определения кода завершения чуть-чуть другие, хотя в упомянутом случае код возврата правой части тоже был бы затерт.
Используй

local str rc
str=$(cd /123 && echo ok)
rc=$?
Так же не следует расчитывать на то, что подстановка в local производится слева направо:
B=1 A=2 ; local A=${B} B=${A}
ведёт себя по разному в разных реализациях.

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

ведёт себя по разному в разных реализациях.

жуть какая %)

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

Как он работает, что это такое, и как определяется код возврата детальнейшим образом описано в man bash.

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

что но моцг мне говорит что 'local' это не оператор и не программа

Это встроеная команда шелла, у них есть код возврата. Попробуй мозг вместо «моцга».

anonymous
()

Твоё $? возвращает не результат работы сабшелла, а результат присваивания из предыдущей строки.
Открываем man bash и читаем:

The return status is 0 unless
1) local is used outside a function,

fail, local вызывается внутри функции

2) an invalid name is supplied,

fail, имя переменной валидное

3) or name is a readonly variable

fail, это не readonly переменная. Таким образом local возвращает тебе 0.
Во втором случае ты просто не используешь local и bash ругается, что ты хочешь присвоить что-то str, но в stderr лезут ошибки, которые ты и видишь в виде единцы.

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