Назад | Перейти на главную страницу

Использовать встроенное время оболочки при проверке статуса выхода функции и подавлении вывода

Я пытаюсь сделать следующее в сценарии bash, и мне интересно, возможно ли это:

Это сложная цепочка, и мне не очень удалось заставить все это работать вместе. Я могу заставить код состояния работать, если перестану использовать время.

Вот что у меня было до сих пор:

# the setup
TIMEFORMAT=%R
MYSQL=mysql <options>

# execute and time a query (does more than is listed here)
function executeQuery {

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null ) 2>&1 )

  # do something with $?

}

Я перенаправляю любой ответ об ошибке из команды в файл с помощью tee, а затем отправляю полученный стандартный вывод в / dev / null. Затем я перенаправляю stderr команды time на stdout, который должен закончиться в $ TIME.

Теперь, если я изменю эту строку на что-то вроде:

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

Он правильно отправляет код выхода из mysql, но прерывает команду time.

Это вообще возможно? Я что-то упустил? Надеюсь, цель ясна.

Спасибо!

трепать time является основным PITA. Его вывод невозможно перенаправить без неприятных взломов оболочки, таких как несколько уровней подоболочки. http://mywiki.wooledge.org/BashFAQ/032 предполагает, что правильный ответ:

TIME = $( ( time $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

Обратите внимание, что bash time принимает в качестве аргумента весь конвейер, поэтому размещение подоболочки после вызова времени неверно.

Это было протестировано с

TIME = $( ( time ls /asdfasfdsfs 2>&1 | tee asdf 2>&1 >/dev/null ; exit ${PIPESTATUS[0]} ) 2>&1 );
echo $?;
echo $TIME

Что дало мне

2
real 0m0.003s user 0m0.004s sys 0m0.004s