#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
печатает пустое значение Я ожидал:
1
Почему t1
переменной не присваивается возвращаемое значение команды выхода - 1
?
bash
shell
variable
command-substitution
Жиль "ТАК - перестань быть злым"
источник
источник
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Код выхода был сохранен в $? переменная. Используя подстановку команд только для захвата вывода, вы должны использовать (...) для создания подоболочки :
источник
t1=$?
- использовать его, нет? и не$?
будет забит заданием оп? Я думаю, что спрашиваю, не должно ли это бытьprintf '%d\n' "${t1}"
В
bash
этом работает:Это связано с порядком оценки команд и назначения переменных.
local
имеет собственное возвращаемое значение - и это текущая команда, а не подстановка команды. Причина такие вещи, как ...... может вернуть 1, потому что в этой команде никогда нет возврата, за исключением запуска подоболочки для присвоения
$x
значения - так$?
он не становится засоренным, как это происходит практически во всех других случаях, когда используются подстановки команд.В любом случае, с
local
этим действительно происходит заторможенность - но если вы поймаете его как раз в нужное время - то есть, пока расширения еще оцениваются и до того,local
как у подпрограмм есть шанс засорять это - вы все равно можете назначить его.... печать ...
Вы должны знать, однако, что во многих оболочках вы не можете рассчитывать на то,
$?
что вас поставили на среднюю оценку таким образом. На самом деле, это, вероятно, потому что эти оболочки не утруждают себя переоценкой на каждом возможном этапе, как, возможно,bash
делает - что, я бы поспорил, вероятно, лучшее поведение, чем уbash
. Вы действительно хотите, чтобы ваш интерпретатор рекурсивно оценивал значения цикла, которые, скорее всего, будут перезаписаны до того, как у вас появится возможность их использовать?Во всяком случае, вот как вы можете это сделать.
источник
В зависимости от того, почему вы пытаетесь просто получить код выхода, вы также можете просто запустить,
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
который ничего не делает с выводом команды, он просто оценивает код выхода команды run. Вы можете добавитьor
(or
$ (around the command and you'll still get the same results. A better example might be
если grep -q 'somestring' somefile; затем echo "Найден код выхода somestring равным $?"; Иначе "Не найден код выхода somestring равным $?"; Fi`.Вы также можете проверить код возврата функции, который может быть явным
return 3
или подразумеваемым кодом возврата, который является результатом последней команды, в этом случае вам нужно быть осторожным, чтобы у вас не былоecho
в конце функция, в противном случае она маскирует / сбрасывает предыдущий код выхода.Наконец, подвох, поскольку вы не можете сделать это,
VAR=(SOME_COMMAND)
потому чтоVAR=()
это определение массива, поэтому вам нужноVAR=( $(echo 'Some value') )
.источник