Почему команда `time` не работает с какой-либо опцией?

61

Я попытался использовать timeкоманду с -fопцией для форматирования вывода времени, но я получаю следующую ошибку:

-f: command not found

Затем я попытался использовать другие варианты -a, -oи т.д. , и я получаю ту же ошибку. Даже time --versionне работает ( --version: command not found).

Не говорите мне читать этого человека, потому что я уже много раз это делаю ... Все эти варианты указаны там. Итак, где может быть проблема?

user258266
источник
Помогает sudo apt-get install --reinstall time?
Jobin
9
Или, может быть, внутренняя оболочка timeс/usr/bin/time
Rmano

Ответы:

91

Ну, даже если вам не понравится, я заставлю вас читать снова с большим вниманием man time. В конце EXAMPLESраздела вы найдете:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

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

type time

и результат, вероятно, будет:

time is a shell keyword

Если это так, то ясно, чтобы использовать реальную time команду, вы должны использовать свой явный путь: /usr/bin/time.

Кроме того, если вы больше не хотите использовать ключевое слово shell time, вы можете создать постоянный псевдоним следующим образом:

alias time='/usr/bin/time'

Это заменит ключевое слово shell, timeпотому что команда:

type time

даст следующий вывод:

time is aliased to `/usr/bin/time'
Раду Рэдяну
источник
5
для команд, встроенных в оболочку: {info time} и {type time}. Для двоичных команд: {который раз} и {человеко время}
Майкл Мартинес
@ Майкл info timeо бинарном. help timeо встроенном.
wjandrea
да, извините, я думал «помочь», но вышел «информация»
Майкл Мартинес
21

Поскольку, как объясняют другие ответы, timeэто ключевое слово shell, единственная доступная опция -p:

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

Итак, вам нужно запустить timeэто внутри /usr/bin. Вот несколько способов сделать это:

  • timeВместо этого используйте исполняемый файл:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Используйте, \что заставляет вашу оболочку игнорировать псевдонимы и ключевые слова и вместо этого искать $PATHсоответствующий исполняемый файл:

    \time -f %Uuser ls >/dev/null 
  • Используйте commandвстроенную функцию, которая имеет похожий эффект:

    command time -f %Uuser ls >/dev/null
  • Используйте другую оболочку, в которой нет такого ключевого слова. Например sh(который на самом деле dashна Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • Используйте which, который будет искать через ваш $PATH(ОК, это глупо):

    $(which time) -f %Uuser ls >/dev/null
Тердон
источник
Есть ли способ сделать наоборот - реплицировать встроенный timeс обычным /usr/bin/time? Т.е. перевести скрипт bash в dash.
Дэн М.
@DanM. Я не понимаю Если хочешь встроенную time, беги time. Если вы хотите автономный исполняемый файл, запустите /usr/bin/time.
Тердон
timeнасколько я знаю, в стандартной оболочке Ubuntu нет встроенной функции . Я хочу перевести скрипт с использованием встроенного в автономный с таким же поведением.
Дэн М.
@DanM. тогда просто используй time. Он будет звонить в зависимости от того, какой из них доступен. Это будет встроенный для Bash и автономный для Dash. Если вы используете /usr/bin/time, то он всегда будет вызывать автономный режим, как в bash, так и в dash. Но, похоже, вам следует задавать новый вопрос, объясняя поведение, которое вам нужно. Дайте мне знать, если вы это сделаете, и я постараюсь помочь.
Тердон
да, но встроенный и автономный синтаксис / семантика кардинально отличаются. В любом случае, спасибо. Я задам новый вопрос, если не пойму, как с этим справиться сам.
Дэн М.
17

bashИ zshоболочки имеют свою внутреннюю timeкоманду. Вы должны использовать

/usr/bin/time -f ...

Кстати, я обнаружил, что с помощью (из zsh):

~% which  time
time: shell reserved word
Rmano
источник