получение кода ошибки подкоманды с помощью $(…)

#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. Вы, ребята, быстры!