【问题标题】:Set shell variable with help perl script [duplicate]使用帮助 perl 脚本设置 shell 变量
【发布时间】:2016-06-12 20:47:08
【问题描述】:

我试图在 perl 脚本的帮助下设置 shell 变量名。

但它运行不正常。

system("variable_name=\"variable_value\"");
`variable_name=\"variable_value\"`;

谁能告诉我为什么它不起作用。

实际上我的问题有点不同。 我想知道如何在 perl 脚本的帮助下设置环境“setenv”。 我努力了 $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";

然后我触发命令 echo $VARIABLE_NAME 然后它没有给我从 perl 脚本设置的路径。

谢谢

【问题讨论】:

  • 其实我的问题有点不同。我想知道如何在 perl 脚本的帮助下设置环境“setenv”。我试过 $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";然后我触发命令 echo $VARIABLE_NAME 然后它没有给我从 perl 脚本设置的路径。提前感谢您的支持。
  • 目前还不清楚你想做什么。我建议添加一个独立的复制器——也就是说,包括 in your question 代码,它既执行分配又使用分配,并提供该代码的实际输出和预期输出.
  • 另外,由于它需要五次重新投票,您可能想要一个明确指定的新问题,而不是试图恢复这个问题。
  • perl 脚本中的代码:$ENV{"VARIABLE_NAME"} = "home\ /path_1\ /path_2\ /path_3";系统(“回声 $VARIABLE_NAME”);运行这个 perl 脚本后预期输出:home\ /path_1\ /path_2\ /path_3 实际输出:它不会打印任何东西

标签: perl shell


【解决方案1】:

您无需运行新的 shell 来设置环境变量;实际上,这样做会适得其反,因为该值不会比分配它的 shell 寿命长(除非该 shell 的任何幸存子代可能继承了该值)。

您可以直接在 perl 中简单地设置环境变量:

$ENV{"variable_name"} = "variable_value"

您从 perl 脚本启动的任何后续 shell 都会看到这一点。

【讨论】:

  • 如果您希望环境变量保留在新的 shell 中而不是从 Perl 脚本返回,您还可以执行以下操作:system($ENV{'SHELL'}); kill 'KILL', getppid();
  • @LexScarisbrick,...嗯? system($ENV{'anything'}) 是一个可怕的想法 - 将数据替换为字符串然后传递给 sh -c 是 shell 注入漏洞的秘诀,除非该变量的值已经过仔细审查。而且我根本不清楚您上面评论中的代码更普遍地试图完成什么。如果你想分叉一个子进程,在其中设置一个环境变量,然后执行一个 shell 来替换那个 perl 子进程,最好让它显式。
  • 公平点。我做了一个(可能是错误的)假设,即问题的意图是“Perl 相当于在 shell 中执行source file 是什么?”在 Perl 中设置环境变量,调用system() 来调用一个新的 shell,然后杀死调用 Perl 的进程有效地做到了这一点。但。就像您提到的那样,由于存在安全风险,不应基于环境变量调用新的 shell。
  • 其实我的问题有点不同。我想知道如何在 perl 脚本的帮助下设置环境“setenv”。我试过 $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";然后我触发命令 echo $VARIABLE_NAME 然后它没有给我从 perl 脚本设置的路径。提前感谢您的支持
【解决方案2】:

它正在工作。问题是下一个system 命令运行一个新的shell,它不知道第一个shell 中设置的变量。

system 'x=value; echo $x'; # Outputs "value".
system 'echo $x';          # Empty line - the shell with $x doesn't exist anymore.

【讨论】:

  • 当然不是。这是一个完全不同的过程。您需要将 x 设置为环境变量并将其设置在父进程中(即在调用 system 的 Perl 进程中)。
  • 其实我的问题有点不同。我想知道如何在 perl 脚本的帮助下设置环境“setenv”。我试过 $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";然后我触发命令 echo $VARIABLE_NAME 然后它没有给我从 perl 脚本设置的路径。提前感谢您的支持
  • @AshutoshRawal:对我有用。 perl -we '$ENV{VAR} = q(a/b/c); system q(echo $VAR)'。请注意,变量是用双引号插入的,Perl 不知道您指的是 shell 变量。
  • @Choroba 感谢您的回复,正如您所提到的,我已经尝试过了。但是在运行 perl 脚本之后,如果我在同一个终端上运行命令 echo $VARIABLE_NAME 然后它什么也不打印。在 perl 脚本中 echo $VAR 正在工作,但在终端上它不工作。
  • @AshutoshRawal:这很正常。在子进程中设置变量不能在父进程中更改变量的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多