让我们说以下代码:
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
答案 0 :(得分:0)
它被很好地存储了。回响是打破它的原因,因为您没有引用它。将echo $tmp
更改为echo "$tmp"
。