2017-07-04 9 views
0

Um eine Installation abzuschließen, muss ich die folgende .sh-Datei Quelle:Fehler beim Sourcing-Shell-Skript

function addvar() { 
local tmp="${!1}" ; 
tmp="${tmp//:${2}:/:}" ; tmp="${tmp/#${2}:/}" ; tmp="${tmp/%:${2}/}" ; 
export $1="${2}:${tmp}" ; 
} 

if [ -z "${PATH}" ]; then 
PATH=/share/MontePython/plc-2.0/bin 
export PATH 
else 
addvar PATH /share/MontePython/plc-2.0/bin 
fi 
if [ -z "${PYTHONPATH}" ]; then 
PYTHONPATH=/share/MontePython/plc-2.0/lib/python2.7/site-packages 
export PYTHONPATH 
else 
addvar PYTHONPATH /share/MontePython/plc-2.0/lib/python2.7/site-packages 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/ipp/../compiler/lib/intel64 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/ipp/../compiler/lib/intel64 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/compiler/lib/intel64/ 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/compiler/lib/intel64/ 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/compiler/lib/intel64 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/compiler/lib/intel64 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/lib64 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /lib64 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/lib 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /lib 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/ipp/../compiler/lib/intel64/ 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /share/apps/intel/l_ics_2015.1.133/composer_xe_2015.1.133/ipp/../compiler/lib/intel64/ 
fi 
if [ -z "${LD_LIBRARY_PATH}" ]; then 
LD_LIBRARY_PATH=/share/MontePython/plc-2.0/lib 
export LD_LIBRARY_PATH 
else 
addvar LD_LIBRARY_PATH /share/MontePython/plc-2.0/lib 
fi 
CLIK_PATH=/share/MontePython/plc-2.0 
export CLIK_PATH 

CLIK_DATA=/share/MontePython/plc-2.0/share/clik 
export CLIK_DATA 

CLIK_PLUGIN=rel2015 
export CLIK_PLUGIN 

aber wenn ich es beziehen, bekomme ich folgende Fehlermeldung:

() not correctly positioned 

Irgendeine Idee warum? Das Kuriose ist, dass dieser Fehler passiert, wenn ich auf einem Cluster arbeite, während ich es nicht auf meinem PC habe.

EDIT:

Der Ausgang des lsb_release -a ist:

LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch 
Distributor ID: CentOS 
Description: CentOS release 6.9 (Final) 
Release: 6.9 
Codename: Final 

Der Ausgang des echo $0-tcsh ist.

+0

Welche Linux-Distribution verwenden Sie? Welche Art von Cluster? Ich kann es ohne Probleme sowohl auf CentOS 6.x und 7.x, als auch auf Promox (aber ohne Clustering) beziehen –

+0

Erzielen Sie diesen Fehler mit 'bash' oder' sh'? Sie haben beide markiert, aber sie sind nicht das gleiche –

+0

@BogdanStoica Ich habe den Beitrag bearbeitet, um die Fragen zu beantworten – johnhenry

Antwort

3

Ich denke, Sie verwenden eine andere Shell (Tcsh) als Sh oder Bash. Höchstwahrscheinlich müssen Sie Ihren Quellcode so anpassen, dass er mit tcsh geladen wird. Unter sh/bash arbeitet

[email protected]:~# echo $0 
-bash 
1

In bash ganz gut, Ihr Skript syntaktisch korrekt ist. Aber wenn Sie sh verwenden, dann gibt es ein paar Fehler. Überprüfen Sie die shellcheck Ausgabe:

$ shellcheck script.sh 

In script.sh line 3: 
function addvar() { 
^-- SC2112: 'function' keyword is non-standard. Delete it. 


In script.sh line 4: 
local tmp="${!1}" ; 
^-- SC2039: In POSIX sh, 'local' is undefined. 
      ^-- SC2039: In POSIX sh, indirect expansion is undefined. 


In script.sh line 5: 
tmp="${tmp//:${2}:/:}" ; tmp="${tmp/#${2}:/}" ; tmp="${tmp/%:${2}/}" ; 
    ^-- SC2039: In POSIX sh, string replacement is undefined. 
           ^-- SC2039: In POSIX sh, string replacement is undefined. 
                ^-- SC2039: In POSIX sh, string replacement is undefined. 

Zusammengefasst:

  • function Stichwort ist nicht erforderlich (oder sogar empfohlen)
  • local nicht in POSIX unterstützt sh
  • string Ersatz ${//} ist nicht unterstützt in sh.
+0

Sollte ich es dann zwingen, mit bash verwendet werden? Wenn ja, wie? – johnhenry

+1

Da Sie das Skript verwenden, müssen Sie es ** von 'bash' ** beziehen. – randomir

+0

puttin #!/Bin/bash am Anfang des Skripts? – johnhenry