Команда перед каждой командой bash

18

Кто-нибудь знает способ поставить команду 'time' перед каждой командой в сеансе bash?

jthoenes
источник
1
так ... вы хотите автоматически добавлять «время» к каждой командной строке?
Квик-кихот
1
да, за исключением ... для измерения производительности, очевидно,
jthoenes
относящиеся superuser.com/questions/167283/…
lesmana

Ответы:

37

Извините за неправильный ответ раньше, я неправильно понял ваш вопрос.

Чтобы добавить время перед каждой командой, которую вы выполняете в оболочке, вы можете сделать что-то вроде этого

bind 'RETURN: "\e[1~time \e[4~\n"'

Это повторно свяжет ключ возврата. Теперь каждый раз, когда вы нажимаете клавишу возврата вместо ввода новой строки \ n, она будет переходить к началу строки, вводить текст «время» и пробел, переходить к концу строки и вводить новую строку \ n, создавая тем самым желаемую эффект.

Если вы не хотите жертвовать своим ключом ввода, вы можете создать «второй» ключ ввода-ввода, например, F12, связав команду следующим образом.

bind '"\e[24~": "\e[1~time \e[4~\n"'

Теперь вместо замены ключа возврата вы привязали F12.

Предпосылкой всего этого является то, что bash использует GNU readline для чтения команд. Так что readline будет хорошей отправной точкой для дальнейших манипуляций с командами и т. Д.

Лукас Лёше
источник
1
+1 отличное решение! Мне нравится идея иметь контрольный ключ ввода отдельно от обычного ключа ввода.
шарлатан-кихот
это умная идея. Как вы можете обобщить его для выполнения пользовательской функции перед каждой командой? Я не знаю, как объединить код bash и функцию readline в одной и той же привязке.
Жиль "ТАК - перестань быть злым"
Это не будет работать в Mac? Я запустил команду в терминале, и мой ключ ввода сейчас, похоже, ничего не делает.
Akki
6

Я понимаю, что это выходит за рамки этого вопроса, но ...

В zsh(что, насколько мне известно, супер набор bash), если вы установите следующую переменную в вашем .zshrcфайле:

export REPORTTIME=5

Каждая команда, которая занимает больше 5 секунд (я уверен) будет отображать вывод команды time. Все команды, которые выполняются быстрее, нет. И в таких случаях это никого не волнует, так что приятно не загромождать вещи. Есть также много других интересных функций, zshкоторые вам могут понравиться.

tychoish
источник
Хороший совет. Хотя zsh, безусловно, имеет расширенный набор функциональных возможностей bash , его синтаксис не является расширенным набором синтаксиса bash , поэтому он не является заменой «вставки».
Крис Джонсен
1

Включите \ t в строку приглашения. В вашем приглашении будет указано время, в которое вы его включили. Смотрите: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
источник
Это текущее время, когда генерируется приглашение, а не время, необходимое для выполнения предыдущей команды.
Приостановлено до дальнейшего уведомления.
Правда; и разница между этим и текущим временем следующего приглашения - это время выполнения (конечно, за исключением времени ввода - здесь ваш друг - вставка). Нет необходимости переназначения ключей.
JRobert
0

PS1 кажется стандартным способом сделать что-то подобное.

Джейсон Сундрам
источник
2
Он изменяет отображение, а не фактически выполненную команду.
user1686
@ Grawity Правильно - но это даст вам именно то, что вы хотите ... время, добавленное к каждой строке.
Джейсон Сундрам
3
Который полностью отличается от того, что timeделает (он измеряет, сколько времени потребовалось для выполнения команды).
user1686
@ grawity, я полагаю, ты прав - ты должен сам сделать вычитание. Похоже, у @Jrobert была та же идея.
Джейсон Сундрам