Bash脚本在函数中本地回显


13

在bash脚本中,我尝试将变量尽可能地局部化,然后将需要的内容从波纹管中传递出去

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

但是有可能在包含函数自己的回显的同时执行此操作,因此,如果函数具有自己的消息要输出,则不必将它们捕获在变量中

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'

1
嘿,你们为什么都使用旧的非POSIX function foo()语法?您可以通过减少9个按键来获得更好的POSIX兼容性。
Arthur2e5

2
这种语法对我来说更熟悉
TheLovelySausage 2015年

1
@ Arthur2e5主要是因为在搜索代码时键入“ function”比“ [a-zA-Z0-9] + \(\)\ {”更容易
Alex Jansen

Answers:


16

如果捕获正确的输出流,则可以捕获该函数打印的所有内容。因此,打印某些内容并保存一些其他输出的最简单方法是将多余的输出重定向到标准错误:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

另一种可能性是登录到文件,而不是直接打印日志消息,例如使用类似以下的方式:

log() {
    printf '%s\n' "$@" > my.log
}

也就是说,Bash函数不能返回变量。唯一实际的“返回”值是退出代码。由于这个原因(以及许多其他原因),如果您想要可靠的日志记录,返回值,异常处理等等,则需要使用其他语言,例如Python,Ruby或Java。


5

您可以显示有关标准错误的信息消息:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

Linux Journal》的这篇文章中还提供了其他一些建议:使用全局变量(您不喜欢使用全局变量),或者传递变量名称以返回结果。


/dev/stderr指向fd 2,仍然可以通过&>blah或重定向2>blah/dev/tty可能更好。
Arthur2e5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.