ericew
ericew

Reputation: 29

How do i start an xterm and follow by setenv in the new xterm?

I am writing a perl script, and the objective is to kick start an xterm, follow by setenv, follow by invoke a tool that pre-installed in the system.

Here is my system call command in my perl script

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 was able to start, however it stopped when executing the setenv, after that i tried with the new command by replacing the setenv with $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");

Here is the error message showing up in the new xterm (same for both approach)

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

Please advise that how to make the series of operation works in the new xterm? Thanks!

-Eric-

Upvotes: 1

Views: 1009

Answers (2)

ikegami
ikegami

Reputation: 386541

According to the man page I read, the following is the syntax of the -e option:

-e program [ arguments ... ]

It takes a path to a program, and optionally arguments to pass to that program. Specifically, it doesn't take a shell command. (It would be bad to accept a shell command without having the user specify for which shell!) That doesn't preclude one from running a shell command, though. This simply requires launching a shell, as the following does:

xterm -e sh -c shell_cmd

Solution:

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)

Since a process normally passes a copy of its env vars to process it creates, you could also write the above as follows:

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)

You can use csh similarly; I'm simply more familiar with sh.

Upvotes: 2

Ture P&#229;lsson
Ture P&#229;lsson

Reputation: 6786

The program run with -e must be a program, not a shell built-in like setenv. Off the top of my head, I can think of two solutions:

  1. Set the environment variables before starting xterm. They would then be inherited by xterm.
  2. Let the program run by xterm be a shell, and use that shell to set the environment variables and launch the tool. Something like this (untested):

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

Upvotes: 2

Related Questions