在 bash 中,如何从由 tee 管道传输的函数中退出脚本?

2023-12-29

我试图理解为什么每当我使用function 2>&1 | tee -a $LOGtee 在函数中创建一个无法通过简单退出的子 shellexit 1(如果我不使用tee它工作正常)。下面的例子:

#!/bin/bash
LOG=/root/log.log

function first()
{
echo "Function 1 - I WANT to see this."
exit 1
}

function second()
{
echo "Function 2 - I DON'T WANT to see this."
exit 1
}
first 2>&1 | tee -a $LOG
second 2>&1 | tee -a $LOG

Output:

[root@linuxbox ~]# ./1.sh  
Function 1 - I WANT to see this.
Function 2 - I DON'T WANT to see this.

所以。如果我删除| tee -a $LOG部分,它将按预期工作(脚本将在第一个函数中退出)。

您能否解释一下如何克服这个问题并在函数中正确退出,同时能够输出?


如果您创建管道,该函数将在子 shell 中运行,并且如果您exit从子 shell 中,只有子 shell 会受到影响,而不是父 shell。

printPid(){ echo $BASHPID; }

printPid #some value
printPid #same value
printPid | tee #an implicit subshell -- different value
( printPid ) #an explicit subshell -- also a different value

如果,而不是aFunction | tee you do:

aFunction > >(tee)

本质上是一样的,除了aFunction不会在子 shell 中运行,因此能够影响当前环境(设置变量、调用退出等)。

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

在 bash 中,如何从由 tee 管道传输的函数中退出脚本? 的相关文章

  • 就地改变 numpy 函数输出数组

    我正在尝试编写一个对数组执行数学运算并返回结果的函数 一个简化的例子可以是 def original func A return A 1 A 1 为了加速并避免为每个函数调用分配新的输出数组 我希望将输出数组作为参数 并就地更改它 def
  • 在 R 中使用整数值代替数值(例如 1L 与 1)作为常量的好处

    在 R 源代码中 大多数 但不是全部 函数使用整数值作为常量 colnames lt function x do NULL TRUE prefix col if is data frame x do NULL return names x
  • 查找提供的 Sum 值的组合

    我有一系列这样的数字 myvar 57 71 87 97 99 101 103 113 114 115 128 129 131 137 147 156 163 186 现在我想计算所有这些可能的组合 长度为1到20 其总和等于给定的数字m
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • Excel VBA 中.Delete 和.Clear 的区别?

    有什么区别Worksheets 1 Cells Delete and Worksheets 1 Cells Clear 我问这个是因为我一直用 Clear清除我的工作表内容 但在我之前的帖子中我发现Worksheets 1 Cells De
  • 如何在 jQuery 中声明和使用函数

    我想知道如何在 jQuery 脚本中声明函数 我现在拥有的 function adjust menu alert test test 但是当我这样称呼它时 first link click function adjust menu 它不起作
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 如何在 bash 脚本中使用并行编程/多线程?

    这是我的脚本 bin bash script to loop through directories to merge fastq files sourcedir path to source destdir path to dest fo
  • 如何根据 Bash 中的 VI 模式更改光标形状?

    我的 bashrc 中有以下行 set o vi 我希望我的光标在插入模式下具有管道形状 在命令模式下具有块形状 就像我在 vimrc 中放置以下内容时在 Vim 中的形状一样 let t SI e 6 q let t SR e 4 q l
  • 从 shell 查找不包含特定注释的 XML 文件

    我想搜索 awk grep sed 几个 XML 文件 pom xml 文件 跳过某些文件夹 而且 第一个条件是它们必须包含标签
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • C++ 如何确定字母表中一个单词是否在另一个单词之前

    我正在使用sort C 中的函数对 Game 类型的对象向量进行排序 这是我自己定义的 为此 我手动编写一个函数来代替operator lt 并将作为第三个参数传递给sort 功能 首先 我根据分数进行比较 然后 如果分数相同 我会根据球队
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 在 bash 中添加(收集)退出代码

    我需要依赖于脚本中的几个单独的执行 并且不想将它们全部捆绑在一个丑陋的 if 语句中 我想使用退出代码 每次执行并添加它 最后 如果这个值超过阈值 我想执行一个命令 伪代码 ALLOWEDERROR 5 run something RESU
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 比较两个文件的单列

    我有两个文件 每个文件都有两列 并用空格分隔 我想找到两个文件中第 2 列不相同的行 并将它们输出到第三个文件 file A 1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 BBBBBBBBBBBBBBBBBBBBBB
  • 以不敏感的方式在 bash 中查找路径

    假设一条路径像 home albfan Projects InSaNEWEBproJECT 尽管事实上不使用这样的名称 有没有办法以不敏感的方式检查路径 我遇到了这个解决方案 但如果可能的话 我想找到一个内置或 gnu 程序 functio

随机推荐

  • 使用 python 和 gmail 在同一线程中发送多封电子邮件

    我有一个程序正在运行 当该程序获得结果时 它会使用以下函数向我发送一封电子邮件 def send email message import smtplib gmail user OMITTED gmail pwd OMITTED FROM
  • opencv-python 和 opencv-contrib-python 之间的区别

    我在查看 Python 包索引 PyPi 时发现有 2 个非常相似的包 opencv contrib python https pypi org project opencv contrib python and OpenCV Python
  • Scaffold-DbContext“方法或操作未实现”

    过得并不愉快 PM gt 命令运行 Scaffold DbContext Server myserver Database mysqlserverdb Trusted Connection True Microsoft EntityFram
  • 在 Amazon RDS 控制台中找不到数据库安全组

    不确定亚马逊最近是否删除了数据库安全组 Created a DB instance as shown below But there is no DB security group tab on the left 回到仪表板 它说我有 2
  • 使用 Wildfly 插入 Postgres 的 json 列

    我正在运行一个 Web 应用程序 它是一个 REST API 我使用的是 Wildfly 9 0 2 和 PostgreSQL 数据库连接使用最新的jdbc4 2驱动 jre是oracle的jr8 我按照这个安装了jdbctopic htt
  • App Store 批准后不显示我的应用程序

    我开发了 iOS 应用程序 并于 2013 年 8 月 19 日上传了我的应用程序的二进制文件 今天 2013 年 8 月 23 日 我收到 Apple 发来的邮件 内容是 您的应用程序是准备出售 在我的 iTunes Connect 中带
  • Google BigQuery 定价

    我是新加坡管理大学的博士生 目前我正在卡内基梅隆大学从事一个研究项目 该项目需要来自 Github Archive 的历史事件 http www githubarchive org http www githubarchive org 我注
  • 如何安全扫描整数输入? [复制]

    这个问题在这里已经有答案了 Scanner scanner new Scanner int number 1 do try option scanner nextInt catch InputMismatchException except
  • $interval未运行,angularjs

    我不确定为什么这段代码没有运行 我正在尝试设置一个简单的计数器 使用 Angels interval 包装器每秒增加一次 angular module app controller testController function scope
  • 在页面加载之前检查会话变量并重定向到登录页面

    如何使用 ASP NET 在页面加载之前检查变量并重定向到另一个页面 我了解生命周期 并且PageInit 听起来好像是对的 但我似乎找不到任何地方可以在 Visual Studio 中放置没有错误的代码 我不能把onpageinit 在我
  • 带有 XNA 的 Silverlight 与纯 HTML5

    我最近决定进入WP7应用程序开发 但还没有真正开始学习silverlight xna 只有 C 我已经很了解 C 了 我在微软工作的爸爸最近告诉我 学习 Silverlight 没有意义 因为从长远来看它会变得无关紧要 由于HTML5的优越
  • 通过 Selenium 抓取动态内容?

    我正在尝试从Blog http justgivemechocolateandnobodygetshurt blogspot com 通过 Selenium 但它总是返回未渲染的 JavaScript 为了测试这种行为 我尝试等到 ifram
  • Asyncio 和rabbitmq (asynqp):如何同时从多个队列消费

    我正在尝试使用 python asyncio 和同时使用多个队列asynqp http asynqp readthedocs io en v0 4 我不明白为什么我的asyncio sleep 函数调用没有任何效果 代码并没有停在那里 公平
  • 运行子程序时显示动画 gif

    当我的应用程序运行子程序时 如何保持动画 gif 运行 整个用户界面被阻止 所以我尝试以另一种形式显示它 但我得到了相同的结果 两件事情 Use a BackgroundWorker 下面的例子 如果可以的话 最好使用不确定的进度条 但这取
  • 如何将WebResponse.GetResponseStream返回转换为字符串?

    我看到很多例子 但它们都缓慢地将它们读入字节数组或一次 256 个字符 为什么 是否不建议只转换结果Stream值转换为字符串 我可以在其中解析它 您可以使用StreamReader ReadToEnd using Stream strea
  • 获取没有标题/通知栏的窗口大小

    我一直在研究 Android 开发 我想做的一件事就是为我的窗口动态创建背景图像 类似于下面的图像 这是来自我的黑莓应用程序 它由三个独立的部分组成 右下角徽标 左上水印和右下角名称 它的工作与屏幕尺寸无关 因为黑莓应用程序只获取所有三个部
  • 在写入文件之前检查文件是否可写

    我正在尝试创建一个脚本 在写入文件之前检查文件是否可写 确保脚本不会过早退出 我已经走到这一步了 meta stream get meta data file while is writable meta uri sleep rand 0
  • 在元素不存在的地方插入数组,否则更新它(有多个条件)

    id 1 name apple option weight 10 size 40 price 40 weight 40 size 40 price 200 如果重量或大小不同 我想在数组中更新插入新对象 如果大小和重量都匹配 我想更新它 我
  • Bootstrap 弹出框不起作用

    引导弹出窗口没有显示我的页面 这是我的 HTML
  • 在 bash 中,如何从由 tee 管道传输的函数中退出脚本?

    我试图理解为什么每当我使用function 2 gt 1 tee a LOGtee 在函数中创建一个无法通过简单退出的子 shellexit 1 如果我不使用tee它工作正常 下面的例子 bin bash LOG root log log