如何找出执行Perl脚本的脚本,程序或shell?

Rob*_*t P 7 shell powershell perl

我如何确定哪个脚本,程序或shell执行了我的Perl脚本?

示例:如果从shell(为每种类型的shell定制)执行,我可能希望具有人类可读输出,如果从另一个perl脚本调用脚本,则可能需要不同类型的输出,如果从诸如一个持续集成服务器.

动机:我有一个工具可以根据shell执行它来改变输出.我通常将此行为作为脚本的选项实现,但此工具的设计不允许选项.其他shell具有指示正在运行的shell的环境变量.我正在开发一个支持Powershell的补丁,它没有这样的特殊变量.

编辑:这些答案中有许多恰好是特定于Linux的.不幸的是,Powershell适用于Windows. getppid,$ENV{SHELL}变量和炮轰ps将在这种情况下无济于事.此脚本需要跨平台运行.

fle*_*esk 5

你使用getppid().把这个片段放在child.pl:

my $ppid = getppid();
system("ps --no-headers $ppid");
Run Code Online (Sandbox Code Playgroud)

如果从命令行运行它,system将显示bash或类似(以及其他内容).system("perl child.pl");例如parent.pl,在另一个脚本中执行它,您将看到perl parent.pl执行它.

仅使用参数捕获进程的名称(感谢ikegami的正确ps语法):

my $ppid = getppid();
my $ps = `ps --no-headers -o cmd $ppid`;
chomp $ps;
Run Code Online (Sandbox Code Playgroud)

编辑:这种方法的替代方法,可能是创建到您的脚本的软链接,使不同的上下文使用不同的链接来访问您的脚本并检查$0以围绕该脚本构建逻辑.

  • 更可靠:`chomp(我的$ parent_name = \`ps --no-headers -o cmd $ ppid \`);` (2认同)

Mar*_*ahl 1

根据您的环境,您也许可以从环境变量中获取它。考虑以下代码:

/usr/bin/perl -MData::Dumper -e 'print Dumper(\%ENV);' | grep sh
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 系统上,它让我:

'SHELL' => '/bin/bash',
Run Code Online (Sandbox Code Playgroud)

所以我想这说明我正在从 bash shell 运行 perl。如果您使用其他东西,SHELL 变量可能会给您提示。

但假设您知道自己使用的是 bash,但 Perl 是从子 shell 运行的。然后尝试:

/bin/sh -c "/usr/bin/perl -MData::Dumper -e 'print Dumper(\%ENV);'" | grep sh
Run Code Online (Sandbox Code Playgroud)

你会找到:

      '_' => '/bin/sh',
      'SHELL' => '/bin/bash',
Run Code Online (Sandbox Code Playgroud)

所以 shell 仍然是 bash,但 bash 有一个变量$_,它也显示正在执行的 shell 或脚本的绝对文件名,这也可能提供有价值的提示。类似地,对于其他环境,perl 哈希中很可能会留下一些线索%ENV,这些线索应该为您提供有价值的提示。