所以我有类似的想法:
set -eo pipefail
ssh localhost "ls; exit 1" | cat > output
我以为 pipefail 会阻止 cat 写入输出(因为 ssh 会话的退出代码),但似乎不会。然后我尝试创建一个 fifo,但我不确定如何在不消耗 fifo 中的内容的情况下读取 ssh 的退出状态,因为它似乎会等到某些东西“消耗”它。
set -eo pipefail
[[ -e /tmp/sshdump ]] && rm /tmp/sshdump; mkfifo /tmp/sshdump;
ssh localhost "ls; exit 1" > /tmp/sshdump &
wait $! && cat > output
那么,我该如何:
- 避免在第一个例子中过早地使管道退出(并且不到达 cat)?
- 在不消耗 fifo 内容的情况下检查 ssh 的退出代码?
如果重要的话,POSIX 兼容的解决方案总是受欢迎的,但 bash 也很好。在我的特定情况下,我使用的是 windows 和 git-bash,所以可能有一些我不知道的怪癖。
编辑:全面披露,我可能应该从一开始就解释我想要实现的目标,而不是将其简化到问题不能正确反映意图的程度。我试图将远程 ssh shell 上的“mysqldump”输出直接通过管道传输到我机器上的“wp db import”,而无需创建中间文件。我最初认为 pipefail 会停止管道,从而在发生故障时阻止我端的导入。我之所以希望这样做,是因为无需创建临时文件,而且代码更少。