例子:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
包含t
或f
还包含ls
命令的输出。
我可能会写ls -1 a* >/dev/null 2>/dev/null
,但如果有更复杂的脚本可能会导致错误。
有没有办法从 中返回单个值a()
?
例子:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
包含t
或f
还包含ls
命令的输出。
我可能会写ls -1 a* >/dev/null 2>/dev/null
,但如果有更复杂的脚本可能会导致错误。
有没有办法从 中返回单个值a()
?
shell 函数可以返回一个数值。考虑 0 和 1 而不是 'f' 和 't'
#!/bin/sh
a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}
a
r=$?
echo $r
这仍将写入ls -1 a*
您可能仍要处理的输出,但值r
将是 0 或 1,并且不包括输出。
从一行或整个块重定向输出的其他示例很好,并且,正如其他人所建议的,您应该了解测试条件的其他方法(但我假设这ls
是一个任意示例)
您不必使用ls
来检查以 . 开头的文件a
。只需使用外壳
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
您可以将重定向放在命令列表中:
{ 命令1 命令2 } >/dev/null
如果在脚本中的某个时刻您不希望后续命令的任何输出,您可以使用exec
内置命令重定向 shell 的输出:
回声有趣 执行 >/dev/null 回声无聊
请注意,这将持续到脚本结束,而不仅仅是直到函数结束。这会处理有趣的命令之后而不是之前的命令。
有一种方法可以exec /dev/null
通过使用文件描述符操作来恢复 的效果。不过我不一定推荐它,因为在实践中可能会很棘手。这个想法是将连接到标准输出的任何内容重新定位到不同的描述符,然后将标准输出重定向到不同的文件,最后将原始标准输出重新定位回标准输出。
{ exec 3>&1 # 复制 fd 3 到 fd 1(标准输出) exec >/dev/null # 连接标准输出到 /dev/null 回声无聊 exec 1>&3 # 将标准输出连接回保存在 fd 3 中的内容 回声有趣 exec >/dev/null # 再次连接标准输出到 /dev/null 回声更无聊 } 3>/dev/null # 花括号列表的 fd 3 必须连接到某个地方, # 即使实际上不会写入任何内容。
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
考虑使用 [ -f filename ] 和其他文件测试。