我如何启动一个xterm并在新的xterm中执行setenv?

问题描述 投票:0回答:1

我正在写一个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-

perl xterm setenv
1个回答
2
投票

程序运行时 -e 必须是一个程序,而不是像shell内置的 setenv. 在我的脑海中,我想到了两个解决方案。

  1. 设置环境变量 之前 开始xterm。它们就会被xterm继承。
  2. 让xterm运行的程序是一个shell,用这个shell来设置环境变量和启动工具。就像这样(未经测试)。

    system("xterm", "-e", "binsh", "-c", "FOO=bar; FIE=fum; runmyprogram")。


2
投票

根据我读到的手册页面,下面的语法是:"-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.

© www.soinside.com 2019 - 2024. All rights reserved.