time
пишет в stderr
, поэтому можно предположить, что добавление 2>&1
в командную строку должно направить свой вывод stdout
. Но это не работает
test@debian:~$ cat file
one two three four
test@debian:~$ time wc file > wc.out 2>&1
real 0m0.022s
user 0m0.000s
sys 0m0.000s
test@debian:~$ cat wc.out
1 4 19 file
Только с круглыми скобками это работает:
test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out
1 4 19 file
real 0m0.005s
user 0m0.000s
sys 0m0.000s
Зачем нужны скобки в этом случае? Почему не time wc
интерпретируется как одна команда?
io-redirection
shell-builtin
волк-Revo-кошка
источник
источник
time
является ли ключевое слово shell, или/usr/bin/time
. Здесь может быть несколько наборов дескрипторов (оболочки и те, которые прикреплены кtime
процессу). И давайте не будем забывать о тех, которые подразумеваются под()
раковиной. (в ожидании специалиста по bash : p)Ответы:
В
ksh
,bash
иzsh
,time
это не команда (встроенная или нет), это зарезервированное слово на языке, подобномfor
илиwhile
.Используется для определения времени конвейера 1 .
В:
У вас есть специальный синтаксис, который говорит оболочке запустить эту конвейерную линию:
И сообщить статистику времени для этого.
В:
Это то же самое, что вы синхронизации с
cmd > output 2> error
командой, и статистика синхронизации до сих пор идут на STDERR оболочки.Тебе нужно:
Или:
Для перенаправления stderr оболочки
timing-output
до использования конструкции времени (опять же, не команды ) (здесь до времениcmd > output 2> error 3>&-
).Вы также можете запустить эту
time
конструкцию в подоболочке с перенаправленным stderr:Но эта подоболочка здесь не нужна, вам нужно только перенаправить stderr во время
time
вызова конструкции.У большинства систем также есть
time
команда. Вы можете вызвать его, отключивtime
ключевое слово. Все, что вам нужно сделать, это как-то процитировать это ключевое слово, так как ключевые слова распознаются как таковые только в буквальном смысле.Но остерегайтесь формат может быть различным и STDERR обоих
time
иcmd
будут объединены вerror-and-timing-output
.Кроме того,
time
команда, в отличие отtime
конструкции, не может синхронизировать конвейеры или составные команды или функции или встроенные функции оболочки ...Если бы это была встроенная команда, она могла бы рассчитывать вызовы функций или встроенные функции, но не могла рассчитывать время перенаправлений, конвейеров или составных команд.
1 Обратите внимание, что в нем
bash
есть (что можно рассматривать как) ошибка, из-за которойtime (cmd) 2> file
(но не,time cmd | (cmd2) 2> file
например) перенаправляется вывод времени наfile
источник
time
это ключевое слово, а не встроенная оболочка.'time'
для получения исполняемого файла - удобнее, чем писать/usr/bin/time
(или дажеcommand time
:-)).\time
.Там нет команды с именем
time wc
,time
иwc
отдельные слова в оболочке.Теперь часто называются две отдельные программы
time
, одна из которых является ключевым словом оболочки, другая - внешней командой . В оболочках, которыеtime
являются ключевым словом оболочки, при вводеtime wc ...
команды оболочка использовала свое ключевое словоtime
вместо утилиты внешнего времени .Когда оболочка использует
time
ключевое слово, ей не нужно выполнять fork () нового процесса, текущийtime
стандарт и стандартная ошибка не изменяются. Часть перенаправления в:влияет
wc
только.Когда вы используете составную команду
(list)
:оболочка работала
time wc file
внутри подоболочки,(time wc file)
считалась одной командой, а часть перенаправления влияет на ее стандартный вывод и стандартную ошибку, которая теперь включает в себяtime
иwc
.Вы можете добиться того же эффекта без затрат на создание нового процесса, используя другую форму группирования
{list;}
:Если вы используете external
time
, то вы не столкнетесь с этой проблемой, потому что она была запущена в новом процессе:источник
time
и/usr/bin/time
? Исполняемые файлы называются функционально одинаковыми?Потому
time
что вы выполняете это встроенный в Bash. Bash обрабатывает его таким особым образом.Если вы будете использовать настоящий
time
двоичный файл, он будет действовать именно так, как вы ожидаете:Хотя вывод этого времени немного другой:
источник
time cmd > output
разcmd > output
команда, иtime foo | bar
разfoo | bar
.Это не
time
то, что пишет информацию о времени. Встроенная командаtime
заставляет оболочку писать это после завершения команды. Но перенаправление влияет только на команду.В
(time ...)
случае если перенаправление применяется ко всей подоболочке.источник
Поскольку время - встроенная оболочка, оно записывает в stderr оболочки , а не в stderr команды.
Использование скобок переводит всю команду в дочернюю оболочку, чей stderr может быть перенаправлен.
использование фигурных скобок дает похожий результат без фактического запуска подоболочки
(да, вам нужна точка с запятой)
источник