如何在新的 xterm 中启动 xterm 并遵循 setenv?



我正在编写一个perl脚本,目标是启动一个xterm,然后是setenv,然后调用一个预装在系统中的工具。

这是我的perl脚本中的系统调用命令

system("xterm","-hold", "-e", "setenv ZI_LIBERTY_IGNORE_CONSTRUCT_FILES $RAW_RF_DIR/lib/lib2v/qcdc_ignore", "setenv HOME_0IN /p/hdk/rtl/cad/x86-64_linux26/mentor/questaCDC/V10.4g_5/linux_x86_64", "modpath -n 1 $HOME_0IN/bin", "modpath -n 1 $HOME_0IN/modeltech/bin", "/p/hdk/rtl/cad/x86-64_linux30/mentor/questaCDC/V10.4f_5/linux_x86_64/bin/qcdc -c -licq -do run.tcl");

xterm能够启动,但是它在执行setenv时停止了,之后我尝试使用新命令,将setenv替换为$ENV

system("xterm","-hold", "-e", "$ENV{ZI_LIBERTY_IGNORE_CONSTRUCT_FILES} = "$RAW_RF_DIR/lib/lib2v/qcdc_ignore"", "setenv HOME_0IN /p/hdk/rtl/cad/x86-64_linux26/mentor/questaCDC/V10.4g_5/linux_x86_64", "modpath -n 1 $HOME_0IN/bin", "modpath -n 1 $HOME_0IN/modeltech/bin", "/p/hdk/rtl/cad/x86-64_linux30/mentor/questaCDC/V10.4f_5/linux_x86_64/bin/qcdc -c -licq -do run.tcl");

这是新xterm中显示的错误消息(两种方法相同(

Can't execvp $ENV{ZI_LIBERTY_IGNORE_CONSTRUCT_FILES} = "/nfs/fm/stod/stod4003/w.eew.100/rf_uprev_model_2020ww14p1//subIP/hip/MTLM_SA/RF.1//lib/lib2v/qcdc_ignore": No such file or directory

请告知如何在新的xterm中使该系列操作起作用?谢谢!

-埃里克-

-e运行的程序必须是程序,而不是像setenv那样内置的 shell。在我的脑海中,我可以想到两个解决方案:

  1. 在启动 xterm之前设置环境变量。然后,它们将由xterm继承。
  2. 让 xterm 运行的程序是一个 shell,并使用该 shell 设置环境变量并启动该工具。像这样的东西(未经测试(:

    system("xterm", "-e", "/bin/sh", "-c", "FOO=bar;FIE=fum;/run/my/program"(;

根据我读到的手册页,以下是-e选项的语法:

-e program [ arguments ... ]

它采用程序的路径,以及要传递给该程序的可选参数。具体来说,它不需要 shell 命令。(在没有用户指定哪个 shell 的情况下接受 shell 命令是不好的!不过,这并不妨碍人们运行 shell 命令。这只需要启动一个 shell,如下所示:

xterm -e sh -c shell_cmd

溶液:

my $script = <<'__EOS__';
export ZI_LIBERTY_IGNORE_CONSTRUCT_FILES="$RAW_RF_DIR/lib/lib2v/qcdc_ignore"
export HOME_0IN=/p/hdk/rtl/cad/x86-64_linux26/mentor/questaCDC/V10.4g_5/linux_x86_64
modpath -n 1 "$HOME_0IN/bin"
modpath -n 1 "$HOME_0IN/modeltech/bin"
/p/hdk/rtl/cad/x86-64_linux30/mentor/questaCDC/V10.4f_5/linux_x86_64/bin/qcdc -c -licq -do run.tcl
__EOS__
system("xterm", "-hold", "-e", "sh", "-c", $script)

由于进程通常会传递其 env var 的副本来处理它创建的过程,因此您也可以按如下方式编写上述内容:

local $ENV{ZI_LIBERTY_IGNORE_CONSTRUCT_FILES} = "$ENV{RAW_RF_DIR}/lib/lib2v/qcdc_ignore";
local $ENV{HOME_0IN} = "/p/hdk/rtl/cad/x86-64_linux26/mentor/questaCDC/V10.4g_5/linux_x86_64";
my $script = <<'__EOS__';
modpath -n 1 "$HOME_0IN/bin"
modpath -n 1 "$HOME_0IN/modeltech/bin"
/p/hdk/rtl/cad/x86-64_linux30/mentor/questaCDC/V10.4f_5/linux_x86_64/bin/qcdc -c -licq -do run.tcl
__EOS__
system("xterm", "-hold", "-e", "sh", "-c", $script)

您可以类似地使用csh;我只是对sh更熟悉.

最新更新