Причина
grep -ei foo -ei bar -ei baz
не работает, потому что семантика для опции -e
— -e PATTERN
, как и в
grep -i -e foo -e bar -e baz
... так должна была выглядеть команда. Параметр -i
(для нечувствительного к регистру сопоставления )необходимо указать только один раз, и он повлияет на все шаблоны.
С помощью -ei foo
вы просите grep
найти шаблон i
в файле foo
.
Ошибка «сломанная труба» возникает из-за pip3
попытки записи в конец мертвой трубы. Канал мертв, потому что grep
не смог найти файлы foo
, bar
или baz
и завершился (с тремя ошибками «файл не найден» ). Трассировка взята из pip3
, которая является программой на Python (, поэтому она сообщает вам, где именно в коде Python произошла ошибка на его стороне ).
Для этого вам понадобится функция оболочки -вместо псевдонима оболочки -:
function h() {
code="cat ~/.bash_history"
for arg in $@ ; do
code="$code | grep $arg"
done
eval "$code"
}
Вы можете поместить эту функцию в свою .bashrc
или туда, где вы обычно пишете свою инструкцию псевдонима.
Ключевым моментом здесь является то, что для нескольких шаблонов в grep
вам обычно нужно использовать опцию -e
для указания каждого шаблона (, поэтому grep -e pacman -e wine
вместоgrep pacman wine
). Два варианта:
Псевдонимы не поддерживают аргументы, поэтому используйте функцию:
h () {
local args=() # local array to store argument with -e for grep
for i
do
args+=(-e "$i") # tack on the -e for each argument
done
history | grep "${args[@]}"
}
Это предполагает, что все аргументы будут шаблонами для grep
.
Продолжайте использовать псевдоним и добавьте -e
самостоятельно:
h -e pacman -e wine
Таким образом, вы также можете добавить любые другие grep
параметры, которые вы хотите (сказать, например, -C 3
, чтобы показать некоторый контекст вокруг результатов ).