【问题标题】:Echo output to terminal within function in BASH在 BASH 中的函数内向终端回显输出
【发布时间】:2020-11-01 03:55:04
【问题描述】:

我正在用 BASH 编写脚本。我在脚本中有一个函数,我想向用户提供进度反馈。唯一的问题是 echo 命令不会打印到终端。而是将所有回声连接在一起并在最后返回。

考虑到下面的简化代码,我如何让第一个回显在用户终端中打印并将第二个回显作为返回值?

function test_function {
    echo "Echo value to terminal"
    echo "return value"
}

return_val=$(test_function)

【问题讨论】:

  • 可以直接调用test_function,而不是在子shell $(test_function)中执行吗?
  • 也许...我没有意识到用括号括起来会导致它在单独的外壳中运行。所以你的想法类似于下面提到的 nu11p01n73R?

标签: bash


【解决方案1】:

除了发送到 STDERR 之外的解决方案(如果您的 STDERR 有其他用途,或者可能被调用者重定向,它可能是首选)

此解决方案直接打印到终端 tty:

function test_function {
    echo "Echo value to terminal" > /dev/tty
    echo "return value"
}

【讨论】:

  • 我喜欢这个解决方案...但是 /dev/tty 在每台机器上都一样吗?有没有办法动态获取这个位置?
  • 对于异常情况,需要检测操作系统,尝试uname -aman unameecho $OS。或者,也许您需要检测发行版(例如 Linux)。 tty 设备文件不保证在同一个地方。
  • 但即使在 Windows 中,Cygwin 也有 /dev/tty。 :-)
  • 抱歉重提一个老问题,但是当被Systemd 捕获时,这是否也有效?
  • 不知道为什么会和Systemd有关系,我对Systemd也不熟悉。对不起。也许你应该提出一个新问题,
【解决方案2】:

将终端输出发送到标准错误:

function test_function {
    echo "Echo value to terminal" >&2
    echo "return value"
}

【讨论】:

  • bash 似乎也在描述符 &255 上打开 tty,所以如果 stderr 也被重定向,您可以使用 >&255 而不是 >&2 向用户发送消息
  • 这不是稳定/可靠的行为——如果文档中没有涵盖它,则不能保证在未来的版本中保持真实,甚至在所有运行时配置中都保持真实(即交互之间保持一致)和非交互式外壳)。
  • 我认为将非错误定向到 stderr 是不正确的。这不能提供没有错误的错误日志吗?
  • 标准错误用于除主要结果流之外的任何内容,例如内置的 bash 'select' 使用它向用户呈现列表。许多其他程序在请求标准错误时会发送帮助消息。 jpeg2pnm 可能会将 EXIF 数据输出到 stderr...
【解决方案3】:

不要使用命令替换从函数中获取返回值

返回值始终在$? 变量中可用。您可以使用变量而不是使用命令替换

测试

$ function test_function {
> return_val=10; 
> echo "Echo value  to terminal $return_val";
> return $return_val; 
> }

$ test_function
Echo value  to terminal 10

$ return_value=$?

$ echo $return_value
10

【讨论】:

  • 我考虑过这个解决方案,但是在函数完成运行后,回显语句似乎会立即打印出来(我这样说是否正确?)。考虑我的功能是处理器密集型和长时间。我希望它在运行时为用户提供进度更新。
  • Tom Fenech 向我的 OP 发表了一条评论,说我在子 shell 中运行该函数。我没有意识到这就是我正在做的事情。所以这可以工作。
  • @McShaman 命令替换$() 创建一个新的子shell。增加负载
  • 问题是如何将结果(字符串)返回给调用者,同时能够写入控制台。不是如何获得返回码。您的答案根本不返回字符串。
【解决方案4】:

如果您不知道您在哪个终端/设备中:

function print_to_terminal(){
    echo "Value" >$(tty)
}

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2021-01-27
    • 2013-07-31
    • 2021-12-06
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多