Используйте md5sum для проверки файла в скрипте

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

Хотя ответ @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 (которая предшествует 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 с его стандартным выводом, идущим в конвейер.

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

15
20.04.2019, 17:30
0 ответов

Теги

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