我正在编写一个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。在我的脑海中,我可以想到两个解决方案:
- 在启动 xterm之前设置环境变量。然后,它们将由xterm继承。
-
让 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
更熟悉.