#bash #exit-code
#bash #код выхода
Вопрос:
В этом коде :
echo hello > hello.txt
read X <<< $(grep hello hello.txt)
echo $?
$?
ссылается на код выхода инструкции read, который равен 0. Есть ли способ узнать, произошел ли grep
сбой (например, if hello.txt
был удален другим процессом), не разделяя read
and grep
в двух операторах (т. Е. Сначала grep
проверьте $?
then read
).
Комментарии:
1. Почему
read X <<< $()
? Почему бы и нетX=$()
? Какая частьread
вам нужна?2. Мой mystake, это был глупый пример. В принципе, я хочу сделать что-то вроде
command $(grep hello hello.txt)
, а затем проверитьgrep
, удалось ли это.3. Используйте временную переменную.
tmp=$(grep hello hello.txt); grep_exit_status=$?; command "$tmp"
.4. Спасибо за ваш ответ. Я сделаю это. Но мне было интересно, существует ли какая-либо форма «стека кодов возврата» для получения кодов старых команд.
Ответ №1:
Используйте process substitution
вместо command substitution here string
:
read X < <(grep 'hello' hello.txt)
Это поможет вам 1
при использовании echo $?
.
PS: В случае grep
сбоя он запишет ошибку на ваш терминал.
Если вы хотите подавить ошибку, используйте:
read X < <(grep 'hello' hello.txt 2>/dev/null)
Ответ №2:
Просто:
X=$(grep hello hello.txt)
echo $?
Для общего случая, когда вы хотите использовать read для разделения слов, используйте временную переменную:
tmp=$(grep hello hello.txt)
echo $?
IFS=' ' read -r name something somethingelse <<<"$tmp"
Комментарии:
1. Вы, ребята, быстры!