Я пытаюсь создать небольшую функцию zsh, которая позволяет мне просматривать мою историю - hgrep test должен возвращать каждую введенную мной команду, содержащую test.

На моей машине он возвращает только 6 результатов. когда я набираю history | grep test, я получаю намного больше результатов. что дает?

hgrep (){
     history | grep $1
}

Вывод - это готово!

➜  ~ hgrep test
 7887  mkd test
 7889  rm -r test
 7894  hgrep test
 7896  history | grep test

Это неполный вывод. также обратите внимание, что первые результаты намного раньше

➜  ~ history | grep test
  252  cp mgroup /test
  254  cp mgroup /test
  322  vi test.js
  324  node test.js
  325  vi test.js
...

После некоторых поисков выясняется, что разница в поведении связана с тем, когда получен .zshrc. на новом терминале я вижу нежелательное поведение. если я, то source ~/.zshrc это работает.

Однако я все еще не понимаю, почему это могло произойти.

0
Matthew Kime 29 Фев 2016 в 07:33

2 ответа

Лучший ответ

Похоже, ваша команда history alias привязана к чему-то еще (например, fc -l 1) после определения функции hgrep.

Итак, вы можете поместить определение функции hgrep после настроек alias. Или вы можете определить функцию hgrep (и любые другие функции), на которую не будут влиять псевдонимы, параметры оболочки и т. Д.

TL; DR

Команда history по умолчанию выводит список последних 16 событий.

history

то же, что и fc -l.
[…]
fc -l ... [ first [ last ] ]

Если first не указан, для него будет установлено значение -1 (самое последнее событие) или -16, если задан флаг -l.

- zshbuiltins(1) Встроенные команды оболочки {{X1 }}, history

И псевдонимы проверяются и расширяются во время чтения.

Каждое подходящее слово во входных данных оболочки проверяется на предмет наличия для него определен псевдоним. Если да, он заменяется текстом псевдонима если он находится в командном положении
[…]
псевдонимы раскрываются при считывании кода; вся строка читается за один раз

- zshmisc(1) Псевдонимы

Похоже, что функция hgrep использует встроенную в оболочку команду history, которая показывает только несколько событий, и результаты могут отличаться от использования history (который является alias для чего-то else) интерактивно.

Функция hgrep будет переопределена на source ~/.zshrc, history в этой функции будет расширена / заменена на alias на этом этапе. Вы можете проверить полученную функцию, введя следующую команду:

% functions hgrep
hgrep () {
…
(hgrep function's definition will be shown)
2
hchbaw 3 Мар 2016 в 00:58

Команды делают что-то совершенно другое.

 history | grep test

Перечислить все события истории, содержащие строку test.

history test

Возвращается в истории к самой последней команде, начинающейся со строки test, и перечисляет все последующие команды.

0
user1934428 29 Фев 2016 в 11:21