Преобразование аргументов команды в шаблоны поиска в истории

Причина

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 произошла ошибка на его стороне ).

0
30.07.2020, 12:37
2 ответа

Для этого вам понадобится функция оболочки -вместо псевдонима оболочки -:

function h() {
  code="cat ~/.bash_history"
  for arg in $@ ; do
    code="$code | grep $arg"
  done
  eval "$code"
}

Вы можете поместить эту функцию в свою .bashrcили туда, где вы обычно пишете свою инструкцию псевдонима.

2
18.03.2021, 23:15

Ключевым моментом здесь является то, что для нескольких шаблонов в grepвам обычно нужно использовать опцию -eдля указания каждого шаблона (, поэтому grep -e pacman -e wineвместоgrep pacman wine). Два варианта:

  1. Псевдонимы не поддерживают аргументы, поэтому используйте функцию:

    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.

  2. Продолжайте использовать псевдоним и добавьте -eсамостоятельно:

     h -e pacman -e wine
    

    Таким образом, вы также можете добавить любые другие grepпараметры, которые вы хотите (сказать, например, -C 3, чтобы показать некоторый контекст вокруг результатов ).

0
18.03.2021, 23:15

Теги

Похожие вопросы