Попробуйте следующее:
s=$({ time dd ... > /dev/null;} 2>&1)
Chepners ответ дал мне вдохновение для, возможно, лучше:
s=$(exec 2>&1; time dd ... > /dev/null)
$()
не уже подоболочка, поэтому нет необходимости создавать дополнительную подоболочку. Помещение exec 2>&1;
перед командой перенаправляет stdout всей подоболочки, поместив ее после того, как команда сделает ее частью команды до time
и, следовательно, будет применена только к команде, переданной в time
. Опуская exec
и точку с запятой попытается выполнить двоичный код системы time
, а также ошибку, если этого не существует. Опуская только exec
, но сохранение точки с запятой не будет работать, так как это приведет к перенаправлению только новых разветвленных процессов, а встроенное время не будет новым процессом.
Да, и кстати, > /dev/null
не сбрасывает выход самого time
в/DEV/нуль, потому что это тоже часть команды, которая time
выполняется и не применяется к самому времени.
http://stackoverflow.com/q/3928430/469220 – Vlad
Вы также можете использовать '/ USR/BIN/time' или'/bin/time' вместо оболочки встроенной. Это регулярная команда, которая следует за регулярными правилами перенаправления. Построенное '' '' 'bash' немного странно, как вы обнаружили. –
@ Джонатан, спасибо за комментарий. Я могу использовать только встроенную команду. – yart