【问题标题】:sourcing a shell script from a perl script [duplicate]从 perl 脚本中获取 shell 脚本 [重复]
【发布时间】:2024-07-14 15:00:02
【问题描述】:

我有一个 shell 脚本可以将我的路径永久更改为另一个路径。我的要求是使用 perl 脚本来获取它(perl 脚本还有一些其他代码,最后它必须获取下面的 shell scipt)

test.sh:

!/bin/bash
cd /db/oa/invoke/path

test.pl:

!/usr/bin/perl
system("source /home/test.sh");

但采购不起作用。我知道命令 system("sh /home/test.sh --help") 用于从 perl 脚本执行 shell 脚本。但我需要类似的命令来获取 shell 脚本。如果我遗漏任何细节,请告知。我已经看到有人就同一主题提出问题,但我没有看到合适的采购解决方案。谁能帮我解决这个问题。

问候阿南德

【问题讨论】:

  • 没有理智的方法来做你所要求的。子进程不能影响其父进程的环境。您基本上必须拥有 Perl exec Bash,然后将 exec Perl 重新置于自身之上才能实现这一目标。
  • 此外,shebang 需要以两个字符 #! 开头,以使其在语法上有效且实际有用。
  • 如果你是 shell 脚本,就像你的例子,只是改变目录,你可以使用 perl 的 chdir 函数来改变目录。不过,您仍然有上面提出的所有问题。

标签: perl shell


【解决方案1】:

正如@tripleee 所说,您必须自己执行。这是我的做法:

if (defined $ENV{TOTO}) {
    print "TOTO is $ENV{TOTO}\n";
} else {
    my $cmd = ". ./source.txt ; exec $^X $0 " . join(' ', @ARGV);
    system ($cmd);
}

我的脚本 source.txt 包含

export TOTO=titi

【讨论】: