Я пытаюсь сделать следующее в сценарии bash, и мне интересно, возможно ли это:
time
Это сложная цепочка, и мне не очень удалось заставить все это работать вместе. Я могу заставить код состояния работать, если перестану использовать время.
Вот что у меня было до сих пор:
# 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