Ошибка захвата выходных данных команды

В самом grepнет возможности сопоставлять файлы с помощью регулярного выражения.

У вас есть два варианта:

  1. Использовать шелл-глобус, например

    grep -e '9' b*
    

    Вышеупомянутый пример очень простой, но вы можете сопоставлять действительно причудливые имена файлов, особенно если вы используете некоторые из механизмов расширения. Ниже приведен список некоторых полезных функций bash, которые можно включить, аналогичные можно найти в zshи, возможно, в других оболочках :

    .
    • globstar(использует **для соответствия всему дереву каталогов)
    • nocaseglob(случай -нечувствительное совпадение)
    • extglob(расширенные шаблоны :?(), @(), !(), *(),+())
    • nullglob(не соответствующие -шаблоны расширяются до нулевой строки)
  2. Используйте findдля поиска файлов и выполнения grepиз них:

    find. -name 'b*' -exec grep '9' {} +
    

    или если требуется регулярное выражение:

    find. -regex './b.*' -exec grep '9' {} +
    

    Преимущество этого метода в том, что вы можете добавить другие переключатели к findдля выбора файлов не только по имени, но и по дате, размеру и т.д. Это невозможно сделать со стандартными глобусами оболочки, если вы не используете zshи его мощные квалификаторы glob .

0
07.02.2021, 03:26
1 ответ

По умолчанию по крайней мере timeв моем Debian выводит в stderr, что не очень хорошо использовать его в подстановке команд. Хотя в вашей команде вы указываете печатать на /dev/ttyпрямо на терминал, что также не работает.

Скажите ему печатать на /dev/stdoutвместо:

t=$(/usr/bin/time -f "%e" -o /dev/stdout sleep 1)
echo "that took $t s"

или, с перенаправлением в оболочке:

t=$(/usr/bin/time -f "%e" sleep 1 2>&1)
2
18.03.2021, 22:32

Теги

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