作者:吴为36 | 来源:互联网 | 2022-12-05 10:42
关于此有许多讨论:将输出输出到bash函数
我只想知道为什么:
#bin/sh
function myfunc () {
echo $1
}
ls -la | myfunc
将给空行。请问为什么我们的输出ls
不被视为$1
函数?其背后的机制是什么?
如果我们尝试:
#bin/sh
function myfunc () {
i=${*:-$(
然后我们有:
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> John Kugelma..:
函数可以通过两种不同的方式接收输入:
命令行参数:$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"
使用引号书写,否则换行符将被修饰。