Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当函数包含其他回音时,从bash函数(<;4.3)返回字符串的最安全方法_Bash_Function_Shell - Fatal编程技术网

当函数包含其他回音时,从bash函数(<;4.3)返回字符串的最安全方法

当函数包含其他回音时,从bash函数(<;4.3)返回字符串的最安全方法,bash,function,shell,Bash,Function,Shell,我想在函数中打印一些日志样式的消息,但还需要在函数末尾返回一个字符串值 我遇到过名称空间,但不幸的是,我没有使用最新版本的bash 例如: doThing() { echo "stuff" echo "things" echo "usefulstring" } result=$( doThing ) [[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :(" 我真的宁愿避免使用g

我想在函数中打印一些日志样式的消息,但还需要在函数末尾返回一个字符串值

我遇到过名称空间,但不幸的是,我没有使用最新版本的bash

例如:

doThing() {
   echo "stuff"
   echo "things"
   echo "usefulstring"
}

result=$( doThing )

[[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :("
我真的宁愿避免使用globals,从我读到的内容来看,我应该避免使用eval。 那么还有什么其他选择呢


另外,我希望看到stdout上的日志回声,而不是返回值。是否可以在函数中使用重定向来实现此目的?

您可以使用数组并获取最后一个元素:

doThing() {
   echo "stuff"
   echo "things"
   echo "usefulstring"
}

# This creates an array
result=($( doThing ))
echo ${result[@]}    # Just for debugging

# This get the index of the last element
end=$(( ${#result[*]} - 1 ))
result=${result[$end]}

echo $result    # Just for debugging

[[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :("
给出:

stuff things usefulstring
usefulstring
Worked

假设您可以使用最小的磁盘I/O,那么您可以打开一个文件描述符来写入文件,然后在函数完成后解析它

在本例中,fd
3
将用于我们的目的

doThing() {
   echo "stuff"
   echo "things"

   exec 3<> /tmp/foo
   echo "usefulstring" >&3
   exec 3>&-
}
结果将出现在
str
中,您可以在条件中引用它。如果您的文件系统保持
/tmp
/var
忙碌,您可以使用
mktemp
在本地目录中创建一个文件,用于fd


这也满足了您的最后一个要求-我希望在stdout上看到日志回波,但不希望看到返回值。

通常,程序(或shell函数)的日志类型输出与其主要输出数据不同,应该发送到标准错误而不是标准输出,如下所示:

doThing() {
   echo "stuff" >&2    # Logging output goes to stderr
   echo "things"  >&2
   echo "usefulstring"
}
result=$( doThing ) 2>&1
…然后
result=$(doThing)
将把“stuff”和“things”打印到stderr,并将
result
设置为“usefulstring”。如果希望日志输出最终转到脚本的标准输出,可以将其重定向回如下所示:

doThing() {
   echo "stuff" >&2    # Logging output goes to stderr
   echo "things"  >&2
   echo "usefulstring"
}
result=$( doThing ) 2>&1

@anubhava测试纯粹是为了演示,我需要以某种方式在结果中存储“usefulstring”。可能是通过变量扩展?@JordanMackie:你的意思是说你想
回送多个字符串,但只返回last@Inian就是这样!如果
usefulstring
usefulstring
喜欢它,则此功能将中断!非常感谢。