• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Wofür ist setenv???

Hi,

ich hab da ein kleines Problem mit meiner CAD Software. Und zwar geht ProE Wildfire 2 her und liest wohl verschiedene Umgebungsvariablen bei setenv aus. Da wird unter anderem auch die Sprache konfiguriert mit
Code:
setenv LANG german

Wenn ich nun versuche ProE zu starten meint es aber
Code:
setenv: Zu viele Argumente

Und wenn ich da nachsehe bekomme ich da tatsächlich fast 2 Seiten mit Variablen. Was mich nun interessiert ist die Frage ob man diese Variablen braucht, oder ob man die löschen kann ohne auf Gefahr zu laufen sein System zu zerstören.

Oder hat schon mal jemand von einem ähnlichen Problem gehört und es gelöst bekommen?
 

TeXpert

Guru
setenv ist aus der c-Shell :) damit werden Umgebungsvariablen gesetzt, also entweder nutzt Du das Tool in einer entsprechenden Shell (csh) oder Du verwendest das Bash-Äquivalent
Code:
export LANG=german
 

apollo

Newbie
Wenn wir schon mal dabei sind ...

Was ist eigentlich der Unterschied zwischen den beiden Zeilen:
Code:
: ${feld:=wert}
feld=wert
Vor allem: Ich habe die erste Zeile schon mal in einem bash-Script gesehen. Da kann man doch die zweite Version nehmen...
 

regexer

Advanced Hacker
man bash sagt:
Code:
       ${parameter:=word}
              Assign  Default  Values.   If parameter is unset or
              null, the expansion of word is assigned to  parame­
              ter.   The  value of parameter is then substituted.
              Positional parameters and  special  parameters  may
              not be assigned to in this way.
 
apollo schrieb:
Wenn wir schon mal dabei sind ...

Was ist eigentlich der Unterschied zwischen den beiden Zeilen:
Code:
: ${feld:=wert}
feld=wert
Vor allem: Ich habe die erste Zeile schon mal in einem bash-Script gesehen. Da kann man doch die zweite Version nehmen...
man schrieb:
SHELL BUILTIN COMMANDS
Unless otherwise noted, each builtin command documented in this section as accepting
options preceded by - accepts -- to signify the end of the options.
: [arguments]
No effect; the command does nothing beyond expanding arguments and performing any
specified redirections. A zero exit code is returned.

Eigentlich sollte hinter ":" das setzen nicht stattfinden !
Ich nutze ":" immer um bei "set -x" als Debug Details zu erfahren.

Beispiel meinskript.sh:
....
touch $meinevariable
...
: Jetzt sollte in $meinevariable die Datei liegen

Wenn ich dann das Skript aufrufe mit:
bash -x ./meinskript.sh

kommt ein "lesbarer" Kommentar auf den Bildschirm.
 
OP
N

Nightangel

Newbie
Ähmm, ok, jetzt geh ich mal noch googeln was der Unterschied zwischen der C-Shell und der Bash ist, nur das löst leider mein Problem nicht. Wie gesagt, ProE gibt beim starten
Code:
setenv: Zu viele Argumente
aus.

Wie können zu viele Umgebungsvariablen gesetzt sein, und wie wichtig sind die??

Wenn man die nicht braucht könnte man ja alles löschen und nur den Code für die Sprache setzen...
 
So als quick and dirty könnte man die Loginshell für einen User mal
auf csh / tcsh ändern.

Code:
haveaniceday> chsh
Changing login shell for mylogin.
Password:
Enter the new value, or press return for the default.
        Login Shell [/bin/bash]: /bin/tcsh
Shell changed.
 
OP
N

Nightangel

Newbie
Ok, aber mir ist jetzt nicht ganz ersichtlich inwiefern mir das helfen soll??

Es geht mir ja nicht darum das ich Probleme mit der Shell habe, sondern das sich das Programm darüber beschwert das zu viele Umgebungsvariablen gesetzt sind.

Das Programm selber wird aus der "normalen" Bash gestartet, beschwert sich aber über die setenv Variablen...

Langsam bin ich :?

Ich glaube irgendwie das hier niemand so recht mein Problem verstanden hat... oder liege ich falsch??
 
Ich meine schon dein Problem verstanden zu haben.
Bei einem Aufruf von einem Programm wird eine initialisierung mit csh-Syntax
ausgeführt.

Lösung 1: gib dem Skript eine csh als "default" => kannst du über Loginshell ( chsh ) einstellen.
Was mir jetzt noch so einfällt:
Lösung 2: Das Skript in dem die Settings stehen nimmt die "Defaultshell"
Pack in die erste Zeile des Skript mit den Settings:
#!/bin/csh

Dadurch wird das Skript "gezwungen" sich über die csh zu laden.
Sollte auch gehen.

Haveaniceday
 
OP
N

Nightangel

Newbie
Also in dem Startskript steht am Anfang schon

#!/bin/csh -f

Was du mit deinem ersten Lösungsvorschlag meinst verstehe ich nicht, kannst du mir das bitte etwas erklären. Wieso soll ich die Loginshell für das Programm ändern? Das Programm wird ja schon gezwungen sich in der csh zu laden, und es gibt ja nur in der csh den Befehl setenv um Variablen zu setzen. Und da sind dem Programm wohl einfach zu viele Variablen gesetzt.

Hier ist noch einmal der Ausschnitt aus der Bash:
Code:
TUX-MOBIL:/usr/local/bin/proe # ./proe
TUX-MOBIL:/usr/local/bin/proe # setenv: Zu viele Argumente.
Ich kann damit halt gar nichts anfangen...
 
Arbeitest du mit "root" ? ( wegen dem Hash "#" im Prompt. ) solltest du nicht machen.

Die Loginshell ist die Shell die nach dem Einloggen des Users genutzt wird.
chsh kann man nutzen, um diese Shell zu wechseln. Unter Linux sollte die Shell immer
/bin/bash oder /usr/bin/bash sein. ( Bitte nicht für "root" ändern ! )

Eigentlich ist dein Startskript korrekt, wenn "#!/bin/csh -f" am Anfang steht.
Es darf aber _keine_ Zeile davor sein auch kein Zeichen Leerzeichen, etc.

Versuch mal den Aufruf:

csh -f -v "script" auf.

Eventuell ruft das Skript ein weiteres Shellskript auf, bei dem #!/bin/csh am Anfang fehlt.

Haveaniceday

PS: Versuch mal das online man "man chsh"
 
OP
N

Nightangel

Newbie
Nein, bin kein Neuling mehr, arbeite nicht als root...

Ist die Konsole aus dem KDE

Ich habe noch einmal nachgesehen, da sind keine Leerstellen oder Leerzeilen vor dem Aufruf...

Ich habe den Aufruf mal wie vorgeschlagen ausgeführt, es kommt der gleiche Fehler.

Es scheint mir kein Problem der Konsole zu sein, sondern das er mit den vielen umgebungsvariablen nicht zurechtkommt.

Hier ist die Ausgabe von deinem Vorschlag.
Code:
chris@TUX-MOBIL:/usr/local/bin/proe> csh -f -v proe


set rundir="$cwd"
set fullscrname="$0"
set fullscrname=`ls -l $fullscrname | awk '{print $NF}'`
set scrname="$fullscrname:t"
set fullscrpath=$fullscrname:h
if ( $fullscrpath == $fullscrname ) then

cd $fullscrpath
set fullscrpath=$cwd
endif
cd $rundir
set prodir="$fullscrpath:h"
set mc=`$prodir/install/unix/getpmt`
setenv PRODIR $prodir

if ( $mc == "hpux_pa64" ) then
if ( $mc == "hpux11_pa32" ) then
if ( $mc == "hp8k" ) then
if ( $mc == "sgi_elf4" ) then
if ( $mc == "sgi_mips4" ) then
if ( $mc == "sun4_solaris_64" ) then

set libset="$prodir/$mc/obj/ps_libset"
if ( ! -x $libset ) unset libset

setenv MC $mc
setenv PRO_MACHINE_TYPE $mc

setenv PRO_DIRECTORY $prodir

setenv FORCE_PMT $MC
$PRO_DIRECTORY/$MC/obj/proe.exe $*
exit $status
chris@TUX-MOBIL:/usr/local/bin/proe> setenv: Zu viele Argumente.

Und hier ist mal noch der Inhalt des Skriptes:
Code:
#!/bin/csh -f

set rundir="$cwd"
set fullscrname="$0"
set fullscrname=`ls -l $fullscrname | awk '{print $NF}'`
set scrname="$fullscrname:t"
set fullscrpath=$fullscrname:h
if ($fullscrpath == $fullscrname) then
    set fullscrpath=$cwd
else
    cd $fullscrpath
    set fullscrpath=$cwd
endif
cd $rundir
set prodir="$fullscrpath:h"
set mc=`$prodir/install/unix/getpmt`
setenv PRODIR $prodir

if ( $mc == "hpux_pa64" ) then
 if ( ! -d $prodir/hpux_pa64/obj ) then
  set mc="hpux11_pa32"
 endif
endif
if ( $mc == "hpux11_pa32" ) then
 if ( ! -d $prodir/hpux11_pa32/obj ) then
  set mc="hp8k"
 endif
endif
if ( $mc == "hp8k" ) then
 if ( ! -d $prodir/hp8k/obj ) then
  if ( -d $prodir/hp700 ) set mc="hp700"
 endif
endif
if ( $mc == "sgi_elf4" ) then
 if ( ! -d $prodir/sgi_elf4/obj ) then
   set mc="sgi_mips4"
 endif
endif
if ( $mc == "sgi_mips4" ) then
 if ( ! -d $prodir/sgi_mips4/obj ) then
  if ( -d $prodir/sgi_elf2 ) set mc="sgi_elf2"
 endif
endif
if ( $mc == "sun4_solaris_64" )then
 if ( ! -d $prodir/sun4_solaris_64/obj ) then
  if ( -d $prodir/sun4_solaris ) set mc="sun4_solaris"
 endif
endif

set libset="$prodir/$mc/obj/ps_libset"
if ( ! -x $libset ) unset libset

setenv MC $mc
setenv PRO_MACHINE_TYPE $mc

setenv PRO_DIRECTORY $prodir

setenv FORCE_PMT $MC
$PRO_DIRECTORY/$MC/obj/proe.exe $*
exit $status

Hoffe du kannst damit was anfangen.

Bin dir auf jeden Fall schon mal dankbar für deine Hilfe ;)
 
Ich vermute mal, da die Anzahl der Fehlermeldungen deutlich
kleiner als die Anzahl der "setenv" ist, daß wir auf der falschen Spur sind.

Ich könnte mir vorstellen, dass in einem der "setenv variable wert"
wert z.B. ein Leerzeichen" enthält.

Mach mal aus allen:
setenv wert value
setenv wert "value"
z.B.:
setenv FORCE_PMT $MC
in
setenv FORCE_PMT "$MC"

Weitere Möglichkeiten: rausfinden, wo der Fehler auftritt.
Leider weiss ich nicht wie man in csh auf "Standarderror" (stderr) ausgibt.

Wenn du das Script mit:
Code:
bash -c 'echo "echo ich bin hier" 1>&2'
...
bash -c 'echo "echo ich bin hier 2" 1>&2'
...
bash -c 'echo "echo ich bin hier 3" 1>&2'
ergänzt findest du die Zeilen in denen die Fehlermeldung auftritt.

Ein einfaches "echo" reicht in der Regel nicht. Das geht auf "Standard ausgabe" und ist "gebuffert" und dadurch ist die Reihenfolge evtl.
nicht passend zu "stderr".

Haveaniceday

PS: Was mich iritiert: "exe" unter Linux ... gräßlich...$PRO_DIRECTORY/$MC/obj/proe.exe $*
 
OP
N

Nightangel

Newbie
Tut mir jetzt echt leid, aber damit kann ich jetzt nicht wirklich viel anfangen. Wo soll ich das in das Skript eintragen?? Könntest du mir bitte ein Beispiel geben??

Hier ist mal die Ausgabe von setenv:
Code:
TUX-MOBIL /home/chris# setenv
LESSKEY=/etc/lesskey.bin
MANPATH=/usr/share/man:/usr/X11R6/man:/usr/local/man:/opt/gnome/share/man
INFODIR=/usr/share/info:/usr/local/info
NNTPSERVER=news
KDE_MULTIHEAD=false
DM_CONTROL=/var/run/xdmctl
HOSTNAME=TUX-MOBIL.Levien
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
GNOME2_PATH=/usr/local:/opt/gnome:/usr:/usr/local:/opt/gnome:/usr
SHELL=/bin/bash
TERM=xterm
HOST=TUX-MOBIL
XDM_MANAGED=/var/run/xdmctl/xdmctl-:0,maysd,mayfn,sched,rsvd,method=classic
HISTSIZE=1000
PROFILEREAD=true
GTK2_RC_FILES=/etc/opt/gnome/gtk-2.0/gtkrc:/opt/gnome/share/themes//Qt/gtk-2.0/gtkrc:/home/chris/.gtkrc-2.0-qtengine:/home/chris/.kde/share/config/gtkrc
GS_LIB=/home/chris/.fonts
GTK_RC_FILES=/etc/gtk/gtkrc:/home/chris/.gtkrc:/home/chris/.kde/share/config/gtkrc
WINDOWID=48234503
QTDIR=/usr/lib/qt3
XSESSION_IS_UP=yes
KDE_FULL_SESSION=true
USER=chris
JRE_HOME=/usr/lib/jvm/jre
GROFF_NO_SGR=yes
DESKTOP_LAUNCH=kde-open
LS_COLORS=no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;
35:bd=40;33;01:cd=40;33;01:or=40;31:ex=00;32:*.cmd=00;32:*.exe=01;
32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;
31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;
31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;
31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;
35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mng=01;35:*.mov=01;35:*.mpg=01;
35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.tga=01;
35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl=01;35:*.aiff=00;
32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32:
OPENWINHOME=/usr/openwin
XNLSPATH=/usr/X11R6/lib/X11/nls
HOSTTYPE=i586-linux
SESSION_MANAGER=local/TUX-MOBIL:/tmp/.ICE-unix/7701
PAGER=/usr/bin/less
LD_HWCAP_MASK=0x20000000
XDG_CONFIG_DIRS=/usr/local/etc/xdg/:/etc/xdg/:/etc/opt/gnome/xdg/
MINICOM=-c on
KONSOLE_DCOP=DCOPRef(konsole-7597,konsole)
PATH=/usr/sbin:/bin:/usr/bin:/sbin:/usr/X11R6/bin
DESKTOP_SESSION=default
CPU=i686
JAVA_BINDIR=/usr/lib/jvm/jre/bin
LD_RUN_PATH=/usr/lib/fglrx/lib
PWD=/home/chris
INPUTRC=/etc/inputrc
KONSOLE_DCOP_SESSION=DCOPRef(konsole-7597,session-1)
JAVA_HOME=/usr/lib/jvm/jre
XMODIFIERS=@im=local
PYTHONSTARTUP=/etc/pythonstart
TEXINPUTS=::/home/chris/.TeX:/usr/share/doc/.TeX:/usr/doc/.TeX:/home/chris/.TeX:/usr/share/doc/.TeX:/usr/doc/.TeX
HOME=/root
SHLVL=4
TESTME=asdf
OSTYPE=linux
LESS_ADVANCED_PREPROCESSOR=no
XCURSOR_THEME=crystalwhite
LS_OPTIONS=-a -N --color=tty -T 0
WINDOWMANAGER=/usr/X11R6/bin/kde
GTK_PATH=/usr/local/lib/gtk-2.0:/opt/gnome/lib/gtk-2.0:/usr/lib/gtk-2.0:/usr/local/lib/gtk-2.0:/opt/gnome/lib/gtk-2.0:/usr/lib/gtk-2.0
LOGNAME=chris
MACHTYPE=i686
LESS=-M -I
G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-15,CP1252
ACLOCAL_FLAGS=-I /opt/gnome/share/aclocal -I /opt/gnome/share/aclocal
XDG_DATA_DIRS=/usr/local/share/:/usr/share/:/etc/opt/kde3/share/:/opt/kde3/share/:/opt/gnome/share/
LESSOPEN=lessopen.sh %s
PKG_CONFIG_PATH=/opt/gnome/lib/pkgconfig:/opt/gnome/lib/pkgconfig
USE_FAM=
INFOPATH=/usr/share/info:/usr/local/info:/opt/gnome/share/info
DISPLAY=:0.0
LESSCLOSE=lessclose.sh %s %s
G_BROKEN_FILENAMES=1
XAUTHORITY=/root/.xauthsWoMk6
COLORTERM=1
JAVA_ROOT=/usr/lib/jvm/jre
_=/bin/csh
VENDOR=suse
GROUP=root
MORE=-sl
GZIP=-9
CSHEDIT=emacs
XFILESEARCHPATH=/usr/lib/X11/%L/%T/%N%C:/usr/lib/X11/%l/%T/%N%C:
/usr/lib/X11/%T/%N%C:/usr/lib/X11/%L/%T/%N:/usr/lib/X11/%l/%T/%N:/usr/lib/X11/%T/%N:/var/X11R6/%T/%N%C:/var/X11R6/%T/%N
CSHRCREAD=true
LC_CTYPE=de_DE.UTF-8
LD_LIBRARY_PATH=/usr/lib/fglrx/lib
TUX-MOBIL /home/chris#

Zwischendrin sind einige Werte gesetzt wo dann Leerzeichen folgen, sieht für mich allerdings nach Parametern aus die mitgegeben werden sollen...
 
Ich meine das ganze so:

Code:
#!/bin/csh -f

set rundir="$cwd"
set fullscrname="$0"
set fullscrname=`ls -l $fullscrname | awk '{print $NF}'`
set scrname="$fullscrname:t"
set fullscrpath=$fullscrname:h
if ($fullscrpath == $fullscrname) then
    set fullscrpath=$cwd
else
    cd $fullscrpath
    set fullscrpath=$cwd
endif

bash -c 'echo "echo ich bin hier 1" 1>&2'

cd $rundir
set prodir="$fullscrpath:h"
set mc=`$prodir/install/unix/getpmt`
setenv PRODIR $prodir

bash -c 'echo "echo ich bin hier 2" 1>&2'

if ( $mc == "hpux_pa64" ) then
 if ( ! -d $prodir/hpux_pa64/obj ) then
  set mc="hpux11_pa32"
 endif
endif
if ( $mc == "hpux11_pa32" ) then
 if ( ! -d $prodir/hpux11_pa32/obj ) then
  set mc="hp8k"
 endif
endif
if ( $mc == "hp8k" ) then
 if ( ! -d $prodir/hp8k/obj ) then
  if ( -d $prodir/hp700 ) set mc="hp700"
 endif
endif
if ( $mc == "sgi_elf4" ) then
 if ( ! -d $prodir/sgi_elf4/obj ) then
   set mc="sgi_mips4"
 endif
endif

bash -c 'echo "echo ich bin hier 3" 1>&2' 

if ( $mc == "sgi_mips4" ) then
 if ( ! -d $prodir/sgi_mips4/obj ) then
  if ( -d $prodir/sgi_elf2 ) set mc="sgi_elf2"
 endif
endif
if ( $mc == "sun4_solaris_64" )then
 if ( ! -d $prodir/sun4_solaris_64/obj ) then
  if ( -d $prodir/sun4_solaris ) set mc="sun4_solaris"
 endif
endif
bash -c 'echo "echo ich bin hier 4" 1>&2'
set libset="$prodir/$mc/obj/ps_libset"
if ( ! -x $libset ) unset libset

setenv MC $mc
bash -c 'echo "echo ich bin hier 5" 1>&2' 
setenv PRO_MACHINE_TYPE $mc
bash -c 'echo "echo ich bin hier 6" 1>&2' 
setenv PRO_DIRECTORY $prodir

setenv FORCE_PMT $MC
bash -c 'echo "echo ich bin hier 7" 1>&2' 
$PRO_DIRECTORY/$MC/obj/proe.exe $*
bash -c 'echo "echo ich bin hier" 8>&2' exit $status

Je nachdem zwischen welchen "ich bin hier" die Meldung kommt, kannst du sehen wo der Fehler sein sollte.

Haveaniceday
 
OP
N

Nightangel

Newbie
So, habe das Skript so wie du es gepostet hast übernommen...

Bei Nr. 7 ist es abgebrochen, das echo von Nr. 8 ist nicht mehr gekommen. Tja, ich weiss zwar nun in welcher Zeile der Bug ist, aber wirklich was damit anfangen kann ich nicht.
 
OOps, Zeilenvorschub vergessen:
Sollte sein:
bash -c 'echo "echo ich bin hier" 8>&2'
exit $status

Zwischen welchen Zeilen kommt dann deine Fehlermeldung:
setenv: Zu viele Argumente
 
OP
N

Nightangel

Newbie
Hier ist die Ausgabe:

Code:
TUX-MOBIL:/usr/local/bin/proe # ./proetest
echo ich bin hier 1
echo ich bin hier 2
echo ich bin hier 3
echo ich bin hier 4
echo ich bin hier 5
echo ich bin hier 6
echo ich bin hier 7
setenv: Zu viele Argumente.
echo ich bin hier
TUX-MOBIL:/usr/local/bin/proe #
 
Damit ist dein Fehler gar nicht in der Datei sondern in:

$PRO_DIRECTORY/$MC/obj/proe.exe $*

Ist das ein "csh"-Skript ?

Schreib mal:
echo $PRO_DIRECTORY/$MC/obj/proe.exe $*
$PRO_DIRECTORY/$MC/obj/proe.exe $*

Dann siehst du den genauen Aufruf und findest den Pfad von proe.exe
heraus.
 
OP
N

Nightangel

Newbie
Hmm, also KDE sagt das wäre ein binäres Windowsprogramm??? Das verwirrt mich jetzt allerdings schon ziemlich... Mein Prof hat mir die CD gegeben, wo er das ganze Programm her hatte, keine Ahnung, aber das dass ein Windowsprogramm ist... kann ja fast nicht sein
 
Oben