Rob*_*t P 7 shell powershell perl
我如何确定哪个脚本,程序或shell执行了我的Perl脚本?
示例:如果从shell(为每种类型的shell定制)执行,我可能希望具有人类可读输出,如果从另一个perl脚本调用脚本,则可能需要不同类型的输出,如果从诸如一个持续集成服务器.
动机:我有一个工具可以根据shell执行它来改变输出.我通常将此行为作为脚本的选项实现,但此工具的设计不允许选项.其他shell具有指示正在运行的shell的环境变量.我正在开发一个支持Powershell的补丁,它没有这样的特殊变量.
编辑:这些答案中有许多恰好是特定于Linux的.不幸的是,Powershell适用于Windows. getppid,$ENV{SHELL}变量和炮轰ps将在这种情况下无济于事.此脚本需要跨平台运行.
你使用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以围绕该脚本构建逻辑.
根据您的环境,您也许可以从环境变量中获取它。考虑以下代码:
/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,这些线索应该为您提供有价值的提示。
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |