Альтернатива «read -u» для оболочек POSIX - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь перенести эту функцию из zsh в общий сценарий оболочки POSIX:

mcp () {
    # run commands on a variety of searches (defaults to giving a count)
    while read -u9 -n line ; do
        command=`echo $line| sed 's/#.*$//'`
        echo -n $command
        eval "$command | ${*:-wc -l}"
    done 9<<EOF
magrep "Precedence:bulk"         # mass mails
magrep "broadcastSendId:.*"      # mass mails
magrep "Feedback-ID:.*"          # mass mails
EOF
}

( Контекст здесь )

В цикле while используется файловый дескриптор9 вместо stdin, так что команды в цикле могут включать команды, которые читают из stdin функции.

POSIX, по-видимому, допускает такое же перенаправление, но его чтение не имеет опции "-u"взять альтернативный ввод fd, и я изо всех сил пытаюсь найти команду перенаправления, которая работает как замена.

У кого-нибудь есть альтернатива чтению -u для POSIX-версии этой функции?

1 Ответ

0 голосов
/ 19 октября 2018

Просто открывайте команду чтения каждый раз, когда дескриптор файла передается в стандартный ввод:

while read line <&9; do
       echo "$line"
done 9<<'EOF'
magrep "Precedence:bulk"         # mass mails
magrep "broadcastSendId:.*"      # mass mails
magrep "Feedback-ID:.*"          # mass mails
EOF   

или более расширенный пример:

while 
    IFS= read -r line <&9
    IFS=' ' read -r file2col1 file2col2 <&10
    IFS=' ' read -r file3col1 file3col2 <&11
do
    echo -----------
    echo "$line"
    echo "$file2col1"
    echo "$file2col2"
    echo "$file3col1"
    echo "$file2col2"
done 9<<'EOF' 10<<EOF2 11<<'EOF3'
magrep "Precedence:bulk"         # mass mails
magrep "broadcastSendId:.*"      # mass mails
magrep "Feedback-ID:.*"          # mass mails
EOF
file2 a
file2 b
file2 c
EOF2
file3 1
file3 2
file3 3
EOF3

Если вы хотите читать файл построчноидиоматическим способом всегда устанавливайте IFS, поэтому сохраняйте начальные и конечные пробелы и используйте опцию -r, чтобы не удивляться расширению \$, поэтому используйте:

while IFS= read -r line

Также команду чтения, которую вы разместилине будет работать, потому что у вас есть опция -n, которая не является опцией POSIX (и имеет разные значения в zsh и bash - вы используете версию zsh).

  1. Попробуйтене использовать echo, который не является переносимым, но использовать printf.
  2. Подстановка команд `as устарела в bash (это не bash, я знаю), вместо этого используйте $(...), что позволяет вложить.
...