【问题标题】:What is the correct way to pass information from my program to the calling script (on exit)将信息从我的程序传递到调用脚本的正确方法是什么(退出时)
【发布时间】:2018-01-15 08:42:57
【问题描述】:

我想知道,当程序退出时,将信息从程序传递到调用脚本的正确方法是什么?假设我有“程序 X”和一个应该执行以下操作的 shell 脚本:

1) 调用可以返回“状态A”或“状态B”的“程序X”

2) 成功执行“程序 X”后,继续执行 3A) 或 3B),取决于它的返回状态

3A) 做一些在“程序X”中不容易做到的事情

3B) 做一些在“程序X”中不容易做的事情

当然,我可以简单地使用返回码来指示 shell 脚本应该如何继续。但是,我认为退出代码 0 表示成功,而所有其他值表示错误是一个被广泛接受的约定。从这个角度来看,使用退出代码来确定后续控制流(成功执行后)显然是对系统的滥用。

所以我的问题是:实现这一目标的正确方法是什么?

感谢任何提示!

【问题讨论】:

  • 当你调用一个程序时,按照惯例,它会返回退出状态,'0' no-error,或者在失败时返回一个正的错误代码。 (并非所有程序都符合,但所有正常程序都符合)在您的脚本中,您只需测试程序是否成功执行,例如if ! ./program; then #handle error; fi。差不多就是这样。
  • @DavidC.Rankin 我从字面上说我不想使用退出代码系统,我这样做的原因以及 3A) 和 3B) 与成功执行无关。
  • 如果不使用退出代码,您将无法执行此操作。 (除非你做了一些非常棘手的事情,比如查看Program 所做的事情,或者将其输出通过管道传输到read 并进行测试)。您问“实现此目标的正确方法是什么?” - 答案是检查退出代码。
  • 您是否有三种可能的结果(“A”、“B”和失败)?如果是这样,您将需要进程替换 (case "$(programX)" in "StateA") do3A;; "StateB") do3B;; esac)。但是,如果您可以使用退出状态(例如 greptest)会更容易 - 这就是它的用途!

标签: linux shell exit


【解决方案1】:

这是shell中命令替换的简单应用。

命令替换

假设ProgramX3A3B 是您的可执行文件。

不是返回State A/State B,而是根据条件简单地回显3A/3BProgramX 然后只需使用命令替换

$(ProgramX)

上面将相应地运行3A3B

注意:缺点是您将无法将其他任何内容打印到stdout


编辑:为什么不根据条件将 3A 或 3B 附加到 ProgramX 的末尾

程序X

#at the end
[ 'condition for 3A' ] && 3A 
[ 'condition for 3B' ] && 3B

顺便说一句,你并没有打破任何惯例


编辑:退出状态方式

如果您想以退出状态方式执行此操作,则在ProgramX 基于条件返回 58 或 59。您实际上可以返回任何内容,但 58 是十进制 # 对应于十六进制的 3A 和 59 对应于 3B .

程序X

#at the end
[ 'condition for 3A' ] && exit 58
[ 'condition for 3B' ] && exit 59

那么做

[ $? -eq 58 ] && 3A
[ $? -eq 59 ] && 3B

【讨论】:

  • 原则上我是个好主意。然而,这意味着我不能向stdout 写入任何其他信息,这当然不理想。
猜你喜欢
  • 2012-02-29
  • 2016-11-23
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2014-10-31
  • 2021-09-14
  • 2023-03-06
相关资源
最近更新 更多