bash函数使用stdin两次[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

让我们说下面的代码:

myfunc() {
    cat grep "\->"  | while read line
    do
        echo $line
    done
}

ls -la | myfunc

它会工作,因为你只能一次猫,因为你只能从stdin读一次。但如果你:

myfunc() {
    cat grep "\->"  | while read line
    do
        echo "a"
    done

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

ls -la | myfunc

这将产生与第一个例子相同的输出。所以在这里,我们希望看到如何将stdin存储为变量。

我们试试吧:

myfunc() {        
    tmp="$(cat)"
    # or: tmp=${*:-$(</dev/stdin)}
    echo $tmp
}

ls -la | myfunc

这给了total 32 drwxr-xr-x 9 phil staff 306 Sep 11 22:00 . 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 -rw-r--r-- 1 phil staff 0 Sep 11 22:00 t1 -rw-r--r-- 1 phil staff 0 Sep 11 22:00 t2 -rw-r--r-- 1 phil staff 0 Sep 11 22:00 t3 -rwxr-xr-x 1 phil staff 72 Sep 11 22:27 test.sh

这不保留ls的原始格式。请问如何将stdin正确存储到本地var s.t中,我可以将其用作

myfunc() {
    # TODO: store stdin into a var `tmp` exactly as it is (with \n)

    echo $tmp | grep "\->"  | while read line
    do
        echo "a"
    done

    echo $tmp | grep "\->"  | while read line
    do
        echo "b"
    done
}

ls -la | myfunc
bash shell terminal
1个回答
0
投票

它存储得很好。回应它是什么打破了它,因为你没有引用它。将echo $tmp改为echo "$tmp"

© www.soinside.com 2019 - 2024. All rights reserved.