Алфавитный список Grep, если он не находится в трубопроводе

Я хочу создать псевдоним bash для grep, который добавит номера строк:

alias grep='grep -n' 

Но это, конечно же, добавляет номера строк в трубопроводы. Большую часть времени (и никаких исключений не приходит на ум) я не хочу, чтобы номера строк в конвейере (по крайней мере, внутри, возможно, ОК, если это последнее), и я действительно не хочу добавлять sed / awk / cut для трубопровод только для того, чтобы вытащить их.

Возможно, мои требования могут быть упрощены, чтобы «только добавить номера строк, если grep является единственной командой в строке». Есть ли способ сделать это без особо уродливого псевдонима?

2 Solutions collect form web for “Алфавитный список Grep, если он не находится в трубопроводе”

Вы можете использовать функцию в bash (или любой оболочке POSIX) следующим образом:

 grep() { if [ -t 1 ] && [ -t 0 ]; then command grep -n "$@" else command grep "$@" fi } 

Часть [ -t 1 ] использует [ команду (также известную как test ), чтобы проверить, связано ли stdout с tty.

[ -t 0 ] проверяет стандартный ввод, так как вы указали только добавить номера строк, если grep является единственной командой в конвейере.

(для полноты)

Хотя ответ @ enzotib, скорее всего, вы хотите, это не то, о чем вы просили. [ -t 1 ] проверяет, является ли дескриптор файла терминальным устройством, а не что-то другое, кроме как канал (например, обычный файл, сокет, другой тип устройства, например /dev/null …)

[ Команда не имеет эквивалента -t но для труб. Чтобы получить тип файла, связанного с файловым дескриптором, вам необходимо выполнить системный вызов fstat() . Для этого нет стандартной команды, но некоторые системы или оболочки имеют некоторые.

С GNU stat :

 grep() { if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 || [ "$(LC_ALL=C stat -c %F -)" = fifo ]; then command grep "$@" else command grep -n "$@" fi } 

Или с zsh и его собственным stat builtin (который предшествует GNU один на несколько лет), здесь загружается только как zstat :

 grep() { zmodload -F zsh/stat b:zstat local stdin_type stdout_type if zstat -A stdin_type -s -f 0 +mode && zstat -A stdout_type -s -f 1 +mode && [[ $stdin_type = p* || $stdout_type = p* ]] then command grep "$@" else command grep -n "$@" fi } 

Теперь несколько примечаний:

Это не только оболочки, которые используют трубы.

 var=$(grep foo bar) 

или:

 cmd <(grep foo bar) 

или:

 coproc grep foo bar 

также запускайте grep с его stdout, идущим к трубе.

Если ваша оболочка ksh93 , обратите внимание, что в некоторых системах она использует сокеты вместо труб в своих конвейерах.

  • bash как перенаправить вывод из функции в / dev / null
  • Как использовать аргументы с 'find -exec'?
  • Bash: неоднозначное перенаправление
  • Что означает «пакетный режим» для верхней команды?
  • tee stdout to stderr?
  • Почему sftp скрывает журнал из stdout?
  • хранить и выполнять команду redirection / piped в скрипте
  • отключить буферизацию для `hping` в OpenBSD
  • Разница между 2> & -, 2> / dev / null, | &, &> / dev / null и> / dev / null 2> & 1
  • Командная строка: <<< вместо <<
  • Сохраните stdout и stderr в файле, затем заново создайте вывод позже
  • Как перенаправить вывод из приложения командной строки (интерпретатор howie AIML) в другое приложение командной строки (espeak)?
  • Interesting Posts

    Bash для чтения двух конкретных строк из текстового файла и использования частей из них в качестве переменной

    ядро марсианского источника и от одного и того же IP-адреса

    определение firewalld-разрешений без SELinux в Debian

    Ubuntu & Linux Mint: драйверы нескольких графических карт

    Как сделать принтер с точечной матрицей печатать каждую строку 'tail -f'

    Где будут настроены дополнительные IP-адреса, назначенные сетевому адаптеру для CentOS 4.4?

    Как я могу запретить моей точке доступа hostapd делать заявку на маршрутизацию в Интернет?

    Как открыть несколько файлов из `find`?

    Есть ли способ определить, какой файл (сценарий, в частности) выполнил команду?

    Как исправить шрифты, отображаемые только жирным или курсивом после копирования Windows / Fonts?

    find и sed (найти и заменить) вызывает незаконную последовательность байтов в Mac OS X

    Можно ли ускорить мой Linux Clock?

    нестрочный инструмент для замены строк?

    Пользователь не имеет доступа к crontab

    удалить все .swp-файл, используя команду rm

    Linux и Unix - лучшая ОС в мире.