我正在写一个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?谢谢! -Eric-
-Eric-
程序运行时 -e
必须是一个程序,而不是像shell内置的 setenv
. 在我的脑海中,我想到了两个解决方案。
让xterm运行的程序是一个shell,用这个shell来设置环境变量和启动工具。就像这样(未经测试)。
system("xterm", "-e", "binsh", "-c", "FOO=bar; FIE=fum; runmyprogram")。
根据我读到的手册页面,下面的语法是:"-e"、"-c"、"FOO=bar"、"FIE=fum"、"runmyprogram";;。-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)
因为一个进程通常会把它的envars的副本传给它所创建的进程,所以你也可以把上面的内容写成这样。
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
.