在Perl脚本中,如何确定调用程序的shell



在Perl脚本中,我想确定从哪个shell调用我的Perl脚本。动机是我为";模块";,但在调用模块之前,我需要知道将哪个shell作为参数传递给它。如果我提取$ENV{quot;SHELL"},在某些情况下我可以看到它是/bin/tcsh,但当有人从tcsh SHELL调用/bin/bash,然后调用我的Perl包装器(它无法检测到插入的bash SHELL(时,这会失败。局部变量没有帮助,因为它们没有传递。那么,我该如何弄清楚我的Perl脚本是从哪个shell调用的呢?

我需要知道将哪个shell作为参数传递给它

您应该使用什么取决于您的需求。

  • 如果您想要用户选择的交互式shell,请使用$ENV{SHELL}

    这就是这个变量的全部意义。就像EDITORPAGER一样,SHELL用于在执行特定任务的程序中传达用户的偏好。如果他们配置错误,就要靠他们来修复。

    如果您的用户抱怨使用了错误的shell,您可以记录使用了SHELLenv-var。您也可以通过在启动shell之前输出类似Starting /bin/tcsh (from $SHELL)的内容来暗示它。

  • 如果要运行shell命令,请使用为其编写命令的shell。


如何弄清楚我的Perl脚本是从哪个shell调用的

所问的问题无法回答,因为它依赖于程序是由shell启动的错误前提。很大一部分进程是由非shell程序创建的。

有一些特定于操作系统的方法可以获得父进程的可执行文件(至少在某些系统上(,但我不会详细介绍这一点,因为缺乏专门性,而且答案的第一部分对此进行了讨论。

最新更新