2015-08-04 3 views
2

Я хотел бы иметь возможность создать функцию bash, которая может читать код выхода команды перед трубой. Я не уверен, что есть доступ к этому.Получить код выхода из последнего канала (stdin)

  • echo "1" | grep 2 возвращает код 1 статус
  • echo "1" | grep 1 возвращает код 0 статус

Теперь я хотел бы добавить третью команду для чтения статуса, с трубкой:

  • echo "1" | grep 2 | echo $? будет эхо «0», даже если код состояния равен 1.

Я знаю, что могу использовать echo "1" | grep 2 && echo "0" || echo "1", но я бы предпочел написать его с помощью трубы.

ли они в любом случае, чтобы сделать это (это было бы еще лучше, если бы он работал на большинстве оболочек, как Баш, ш, и ЗШ)

+3

Зачем вам использовать трубку для этого? 'echo" 1 "| grep 2, echo $? 'будет работать нормально. – Yannoff

+0

Потому что мне также может понадобиться то, что происходит от stdin. Тем не менее, я предпочитаю ваше решение, чем одно из @mattinbits – edi9999

+1

Звучит как проблема XY. Зачем вам нужен статус от * внутри * трубопровода? – chepner

ответ

1

В Баш вы можете сделать это с PIPESTATUS переменной

echo "1" | grep 1 
echo ${PIPESTATUS[0]} # returns 0 
echo "1" | grep 2 
echo ${PIPESTATUS[0]} # returns 0 
echo "1" | grep 2 
echo ${PIPESTATUS[1]} # returns 1 
+0

Последняя команда не находится внутри канала. '$?' будет работать намного лучше, потому что я хочу получить последний код состояния, а не nth – edi9999

+0

@ edi9999 поместить его в команду, тогда 'echo" 1 "| grep 2 | echo $ {PIPESTATUS [1]} ' – 123

+0

Да, но если у меня есть три команды вместо двух, это не сработает: например,' echo '1 "| sed | grep 2 | echo $ {PIPESTATUS [1] ' – edi9999

3

Вам нужно будет получить статус выхода до следующий этап трубопровода. Что-то вроде

exec 3> debug.txt 
{ echo "1"; echo "$?" >&3; } | long | command | here 

Вы не можете (легко) инкапсулировать это в функции, так как это требует прохождения должным образом строку в кавычках и выполнение его с помощью eval:

debug() { 
    eval "[email protected]" 
    echo $? >&3 
} 

# It looks easy in this example, but it won't take long to find 
# an example that breaks it. 
debug echo 1 | long | command | here 

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

 Смежные вопросы

  • Нет связанных вопросов^_^