【问题标题】:Determination of a script piping an output into another script确定将输出传送到另一个脚本的脚本
【发布时间】:2017-10-02 13:38:40
【问题描述】:

我有 2 个脚本。脚本 a.sh 将输出传递给脚本 b.sh,处理输出如下:

$ cat a.sh
#!/bin/bash
echo output | ./b.sh  ### piping into STDIN of b.sh script
$
$ cat b.sh
#!/bin/bash
grep output ### reading from STDIN
$
$ ./a.sh
output

有什么方法可以在脚本 b.sh 中确定它从哪个脚本获取输入?我希望 b.sh 脚本找出它是 a.sh。我尝试将 /proc/$$/fd 的内容与 lsof 结合使用,但没有成功。

【问题讨论】:

  • 你为什么想知道?你打算做什么不同的事情?这听起来像XY problem
  • 每个脚本应该是一个不同的进程,你应该能够从 b.sh 脚本的 ps 命令中找出它 :) 父进程应该是 a.sh 脚本

标签: bash pipe stdin file-descriptor


【解决方案1】:

这可能是一个愚蠢的解决方案,但您可以使用 ps 查找父进程,而不是再次使用 ps 从该进程获取命令。

例如,将其添加到您在上面提供的 b.sh 中:

ps -p $(ps -o ppid= -p $$) -o cmd=

从 a.sh 脚本调用时的输出是:

/bin/bash ./a.sh

直接从命令行调用时:

-bash

我想您可以使用 /proc/$$ 文件夹来实现相同的目的,查看 /proc/$$ 获取 parentPid 并读取 /proc/$(parentPid)/cmdline 以获得相同的结果。

所以这样你会做这样的事情:

parentPid=$(cat /proc/$$/stat | awk '{print $4}')
cat /proc/$(parentPid)/cmdline

从a.sh调用b.sh时的输出:

/bin/bash./a.sh

【讨论】:

  • 我可以通过运行:cat /proc/$PPID/cmdline |字符串 | tail -n +2
【解决方案2】:

您可以使用带有PPID 选项的ps 命令或caller 命令来检查调用它的脚本。

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多