如何在 shell 函数内直接在标准输出上回显?

2024-02-20

我在我的脚本中编写了一个在控制台上打印消息的函数。可以从任何其他函数调用它。

function print_message
{
    echo "message content"
}

问题是,在 shell 中,函数如下echo or printf通常在标准输出上打印数据将其消息重定向到调用函数,而不是作为返回值。

return_value=$(print_message) # this line print nothing.
echo $return_value # This line print the message. I don't want to have to do it.

我想避免这种行为并将其直接打印在标准或错误输出上。有办法做到吗?

或者我想在 shell 中使用函数是错误的,我应该使用一个巨大的脚本来处理任何行为吗?


The $(...)调用语法捕获标准输出。这就是它的工作。这就是它的作用。

如果您想要不被捕获的静态消息,那么您可以使用标准错误(但请不要对不是错误消息或调试消息等的内容执行此操作)。

你不能有一个输出到标准输出的函数,但它不会被$(...)它运行在上下文中,因为只有一个标准输出流。你能做的最好的事情就是检测你何时有控制终端/等等。并直接写信给它(但我建议大多数时候也不要这样做)。

要完全重定向到函数的标准错误,您可以执行以下任一操作。

print_message() {
    echo "message content" >&2
}

or

print_message() {
    echo "message content"
} >&2

当只有一行输出时,差异并不重要,但如果有多行输出,则后者可能会稍微优化一些(特别是当输出流恰好是一个文件时)。

还要避免function关键字,因为它不是 POSIX/spec 并且不具有广泛的可移植性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 shell 函数内直接在标准输出上回显? 的相关文章

  • 使用 bash 脚本在 Info.plist 中添加/替换 URL 方案

    我想添加 替换 URL 方案Info plist使用 bash 脚本 命令创建文件 我尝试过sed命令有各种模式但没有成功 我们希望使用 Jenkins 自动生成构建 并且我们的 URL 方案可以针对各种构建进行更改 因此我们想要修改Inf
  • 如何区分 git 分支名称和提交哈希?

    我有一个 bash 脚本 它接受分支名称 例如 master 或 feature foo 或提交哈希 例如 1234abcd 的字符串 我已签出存储库 因此我可以调用 git 确定字符串是分支名称还是提交哈希的最佳方法是什么 bin bas
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User
  • 空格分隔值;如何提供包含空格的值

    我正在创建一个 bash 脚本来通过以下方式配置多个 Azure 资源Azure CLI https learn microsoft com en us cli azure view azure cli latest 到目前为止一切顺利 但
  • 在 shell 中将 ANSI 转换为 UTF-8

    我正在制作一个解析器 1 csv 到 3 csv 脚本 但遇到问题 我是法国人 所以用我的语言我有这样的字母 一位客户向我发送了一个 csv 文件 Linux 将其识别为 unknown 8bit 我猜是 ansi 在我的脚本中 我正在编写
  • 在 bash 脚本中获取星期几

    我想在变量中包含星期几DOW 所以我使用以下 bash 脚本 DOM date d DOW DOM 7 sed s 0 不幸的是我收到这个错误 bash 09 command not found 变量中的预期结果为 2 9 7 2 DOW
  • 如何提供准备好的 git 提交消息?

    按照惯例 我在 git 中创建故事分支 以在其中包含 Jira 问题 ID 例如FOO 1001 我有一个脚本可以帮我做到这一点 现在 我准备了另一个脚本 用于从 Jira API 获取 FOO 1001 的标题 我想在输入时实现这一目标
  • 如何将Matlab命令的输出重定向到文件? [复制]

    这个问题在这里已经有答案了 我想将 Matlab 命令的输出重定向或复制到文件中 我怎样才能做到这一点 就我而言 我想使用 UNIX 工具比较两个大型结构diff 示例 我可以在 Matlab 中执行此操作 gt gt s1 s1 a 32
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • Shell 脚本对文件进行计数,然后删除最旧的文件

    我是 shell 脚本新手 所以我需要一些帮助 我有一个充满备份的目录 如果我有超过 10 个备份文件 我想删除最旧的文件 以便仅留下 10 个最新的备份文件 到目前为止 我知道如何计算文件数 这看起来很简单 但是如果计数超过 10 我该如
  • 如何在带有空格的目录上使用 find ?

    这里有一些奇怪的事情 mkdir p 1 2 3 4 touch 1 2 3 4 file jpg for f in find type f name jpg do echo f done 这返回 1 2 3 4 file jpg and
  • 为什么 PS1 不更新 git 分支名称?

    PS1 w git branch grep cut b 3 100 我按上面设置我的 PS1 但在我更改分支后 它不会更新提示中的分支名称git checkout 或使用以下命令更改存储库cd 如何解决这个问题 当反引号引用位被评估时PS1
  • 重写 openshift maven 脚本 (jenkins gear)

    我在 Openshift 上有 Jenkins 实例 我已启用 Jenkins 构建我的 Openshift 应用程序 这里是 Jenkins shell 脚本的一部分并记录它们生成的内容 Sync any libraries rsync
  • 如何将批处理变量设置为另一个脚本的输出

    我尝试将批处理变量设置为另一个命令的输出 在 Linux Unix 中 您可以简单地使用反引号 例如 在 csh 中 set MY VAR tail etc passwd windows 批处理中有类似的东西吗 实际上我已经发现了一些东西
  • 未找到命令/使用自动测试通过“捆绑安装”安装缺少的 gem 二进制文件

    我对 RoR 完全陌生 我正在关注迈克尔 哈特尔的书 我无法运行自动测试 请提出问题所在以及解决方案 当我在 Rails 项目目录中的命令行运行 自动测试 时 我得到以下信息 bash autotest command not found
  • 通过 bash 调用应用程序时忽略 dyld_insert_libraries

    对于我的应用程序 我使用 DYLD INSERT LIBRARIES 来切换库 我运行的是 Mac OS X El Capitan 如果我在 shell 中设置这些环境变量 export PYTHONHOME HOME anaconda e
  • 在snakemake规则中使用pyenv

    我正在使用 Snakemake 来实现一个漫长而复杂的管道 其中涉及一些外部编写的 python2 脚本 当我尝试使用 pyenv 指定 python2 时 pyenv shell命令失败 同时pyenv global and pyenv
  • 在 bash 中传递多个数组作为参数

    我已经成功地能够调用单个数组作为参数 但在传递多个数组时遇到问题 这是我到目前为止所拥有的 calling function array1 1 2 3 4 array2 a b c d array3 called function arra
  • 无法从外部 bash 脚本正确设置 MySQL 密码

    我有两个脚本 主要的一个脚本执行一些不同的操作并调用第二个脚本 第二个脚本安装 MySQL 从我的主脚本中我做了这样的事情 read p Set the password for the database min 4 characters
  • 命令行/shell 帮助文本是否有“标准”格式?

    如果没有 是否有事实上的标准 基本上我正在编写命令行帮助文本 如下所示 usage app name options required input required input2 options a argument Does someth

随机推荐