почему вывод канала в функцию bash не работает - PullRequest
0 голосов
/ 11 сентября 2018

Существует много дискуссий по этому поводу: Вывод канала в функцию bash

Я просто хочу знать, почему:

  #bin/sh
  function myfunc () {
      echo $1
  }

  ls -la | myfunc

даст пустую строку.Могу я спросить, почему наш вывод ls не рассматривается как $1 как функция?Какой механизм стоит за этим?

Если мы попытаемся:

  #bin/sh
  function myfunc () {
      i=${*:-$(</dev/stdin)}
      echo $i
  }

  ls -la | myfunc

Тогда мы получим:

total 32 drwxr-xr-x 6 phil staff 204 Sep 11 21:18 . drwx------+ 17 phil staff 578 Sep 10 21:34 .. lrwxr-xr-x 1 phil staff 2 Sep 10 21:35 s1 -> t1 lrwxr-xr-x 1 phil staff 2 Sep 10 21:35 s2 -> t2 lrwxr-xr-x 1 phil staff 2 Sep 10 21:35 s3 -> t3 -rwxr-xr-x 1 phil staff 96 Sep 11 21:39 test.sh

, который не сохраняетфактический формат ls -la (с \ n).

Какой правильный / предлагаемый способ передачи вывода команды в функцию в качестве параметра как есть?

Спасибо

Обновление + Джон Кугельман

  #bin/sh
  function myfunc () {
    cat | grep "\->"  | while read line
    do
        echo $line
    done


    cat | grep "\->"  | while read line
    do
        echo "dummy"
    done
      }

  ls -la | myfunc

Печать будет выполняться только один раз.Что если мы хотим использовать результат дважды (сохранить его как возможную переменную?)

Спасибо,

1 Ответ

0 голосов
/ 11 сентября 2018

Существует два различных способа получения входных данных функциями:

  • Аргументы командной строки: $1, $2 и т. Д.
  • Стандартный ввод.

Когда вы передаете вывод от одной команды к другой, она принимается на стандартный вывод, а не в качестве аргументов.Чтобы прочитать его, вы можете сделать одно из следующих действий:

myfunc() {
    cat
}

myfunc() {
    local line
    while IFS= read -r line; do
        printf '%s\n' "$line"
    done
}
ls -la | myfunc

Если вы хотите оставить свою функцию как есть, и она ожидает, что $1 будет установлена, вам нужно будет перейти с каналак команде подстановки.

myfunc() {
    echo "$1"
}
myfunc "$(ls -la)"

Обратите внимание на обильное использование двойных кавычек.Убедитесь, что вы пишете echo "$1" с кавычками, иначе переводы будут искажены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...