假设您有一个shell命令 cat file1 | ./my_script
在'my_script'命令中是否有任何方法可以检测首先作为管道输入运行的命令(在上面的示例 cat file1 中)?
我一直在深入研究它,到目前为止我还没有发现任何可能性。 我一直无法在记录完整命令行的第二个命令的进程空间中找到任何环境变量,my_script命令看到的命令数据(通过/ proc等)只是_./my_script_并且不包含任何有关它的信息作为管道的一部分运行。从第二个命令内部检查进程列表甚至似乎没有提供任何数据,因为第一个进程似乎在第二个进程开始之前退出。
我能找到的最好的信息在bash中建议你在某些情况下可以通过PIPESTATUS得到管道中进程的退出代码,遗憾的是,管道中的命令/文件名称似乎没有任何相似之处。我的研究似乎是说它不可能以通用方式进行(我无法控制人们如何决定运行my_script,所以我不能强制使用第三方管道替换工具来构建shell管道)但它只是在同时似乎不应该是不可能的,因为shell在命令运行时存在完整的命令行。
(更新后面的评论中的后续信息中添加)
我在Linux上。
我已经调查了/ proc / $$ / fd数据,它几乎完成了这项工作。如果第一个命令没有退出几秒钟,而将数据传递给第二个命令,则可以读取/ proc / $$ / fd / 0以查看符号链接的值管道:[PIPEID]。然后可以使用它来搜索其他正在运行的进程的/ proc / / fd / 数据的其余部分,以使用相同的PIPEID找到管道打开的另一个进程,该PIPEID为您提供第一个进程pid。
然而,在大多数现实世界的测试中,我已经完成了管道,你不能相信第一个命令将保持运行足够长的时间,第二个命令有时间在它退出之前在/ proc中找到它的管道fd(删除proc数据阻止它被读取)。因此,如果此方法将返回任何信息,我不能依赖。