Чому команда `time` не працює з жодною опцією?


60

Я намагався використовувати timeкоманду з -fопцією для форматування виводу часу, але я отримую таку помилку:

-f: command not found

Потім я спробував використовувати інші варіанти -a, -oі т.д. , і я отримую ту ж помилку. Навіть time --versionне працює ( --version: command not found).

Не кажіть мені читати людину, тому що я це вже багато разів роблю ... Усі ці варіанти вказані там. Отже, де може бути проблема?


Чи sudo apt-get install --reinstall timeдопомагає?
jobin

9
А може, внутрішня оболонка timeз/usr/bin/time
Rmano

Відповіді:


90

Ну, навіть якщо вам це не сподобається, я змушу вас прочитати ще раз з більшою увагою 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 shell, який використовує внутрішню версію time, надану як ключове слово shell. Ви можете перевірити це за допомогою наступної команди:

type time

і вихід, ймовірно, буде:

time is a shell keyword

Якщо це так, то ясно, щоб використовувати реальну time команду, ви повинні використовувати свій явний шлях: /usr/bin/time.

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

alias time='/usr/bin/time'

Це замінить ключове слово оболонки, timeоскільки команда:

type time

зараз дасть такий вихід:

time is aliased to `/usr/bin/time'

5
для команд, побудованих у оболонці: {info time} та {type time}. Для двійкових команд: {котрий час} та {людина час}
Майкл Мартинес

@Michael info time- про двійкове. help timeйдеться про вбудований.
wjandrea

так, вибачте, що я думав "допомогти", але з'явилася "інформація"
Майкл Мартинес

21

Оскільки, як пояснюють інші відповіді, timeключове слово оболонки, єдиний доступний варіант -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(OK, це нерозумно):

    $(which time) -f %Uuser ls >/dev/null

Чи є спосіб зробити зворотне - тиражувати вбудований timeз регулярним /usr/bin/time? Тобто перекладати скрипт bash на тире.
Дан М.

@DanM. Я не розумію. Якщо ви хочете вбудований time, запустіть time. Якщо ви хочете окремий виконуваний файл, запустіть /usr/bin/time.
тердон

timeнаскільки я не знаю, немає вбудованої оболонки за замовчуванням Ubuntu. Я хочу перевести скрипт за допомогою вбудованого в автономний режим з однаковою поведінкою.
Дан М.

@DanM. то просто використовувати time. Він зателефонує, хто з них буде доступний. Це буде вбудований для bash та автономний для тире. Якщо ви користуєтесь /usr/bin/time, то він завжди буде називати автономний режим, як в баші, так і в тирі. Але це здається, що вам, мабуть, слід задати нове запитання, пояснивши необхідну вам поведінку. Дайте мені знати, якщо ви зробите, і я спробую допомогти.
terdon

так, але вбудований і окремий мають різно синтаксис / семантику. У будь-якому випадку, дякую. Я поставлю нове запитання, якщо я не зрозумію, як з цим самому впоратися.
Дан М.

17

bashІ zshоболонки мають свою внутрішню timeкоманду. Ви повинні використовувати

/usr/bin/time -f ...

До речі, я виявив, що використовуючи (з zsh):

~% which  time
time: shell reserved word
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.