【问题标题】:Bash subshell very weird behavior with ssh command使用 ssh 命令的 Bash subshel​​l 行为非常奇怪
【发布时间】:2018-04-14 12:22:26
【问题描述】:

考虑脚本 s2:

#!/bin/bash
ssh localhost tail

还有脚本 s1

#!/bin/bash
./s2 &
sleep 1000
wait

现在调用 s1。它不会调用 ssh 命令。

如果您删除 s1 中的 & ,它会。 如果您直接调用 ./s2 ,它会。 如果你在控制台中输入 ./s2 ,它就会出现。

但是 ./s1 不起作用。为什么?

【问题讨论】:

  • 你是如何检查的“它不会调用 ssh 命令”
  • 它对我有用。你怎么说它不起作用?
  • 我不知道它不会调用 ssh 命令。如果我删除睡眠,那么它会立即退出。但它确实运行 s2 我检查了它。那么它可能取决于系统,这是不好的......
  • 如果您的s1 脚本背景是s2 运行的tail 命令,您认为tail 应该从哪里获得它的标准输入?如果您将 ssh localhost tail -f /var/log/something 改为 s2 会发生什么?

标签: bash shell unix ssh


【解决方案1】:

我不知道它不会调用 ssh 命令。如果我删除睡眠,它会立即退出。

确定它调用了ssh 命令。它必须!没有魔法。

假设仅仅因为脚本在您删除sleep 时立即退出,它就没有调用ssh,这是一个很大的错误。 这个结论是不正确的。 可能还有其他原因可以解释这种观察到的行为。

如果你想验证ssh 没有运行, 一种方法是查看您的系统日志。

脚本退出很快(不是立即),因为ssh 很快退出。 当s2 运行时,它接收到空的stdintail 命令消耗和输出任何内容, 所以ssh shell 终止,没有任何输出。就是这样。

s2改成这个看看区别:

#!/bin/bash
ls / | ./s2 &
wait

这样s2 将有一个非空的stdin 可以使用, 并且应该产生一些输出。

顺便说一句,sleep 1000 从一开始就没有必要,感谢wait

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多