簡體   English   中英

為什么管道輸出到bash函數中不起作用

[英]why pipe output into a bash function does not work

關於此有許多討論:將輸出輸出到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$2等。
  • 標准輸入。

當您將一個命令的輸出通過管道傳遞給另一個命令時,它將在stdin上接收,而不是作為參數接收。 要閱讀它,您可以執行以下操作之一:

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"用引號引起來,否則換行符將被修飾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM