Как выполнить скрипт ksh из bash - PullRequest
       16

Как выполнить скрипт ksh из bash

0 голосов
/ 17 сентября 2018

В настоящее время у меня есть сценарий ksh, который вызывает другой сценарий ksh. «Родительский» сценарий ksh должен быть вызван из оболочки bash в контексте пользователя оболочки ksh. Попытка выполнить следующее возвращает это сообщение об ошибке

Как пользователь root в оболочке bash

su - whics -c '/usr/bin/nohup /whics/t99/wv.4gm/wv99b.4gs/wv99b.sh -s 1 -m u -sleep 5 > ./nohup.out &'

/ whics / t99 / wv.4gm / wv99b.4gs / wv99b.sh [8]:.: wh_setENV.sh: невозможно открыть [Нет такого файла или каталога]

wh_setENV.sh фактически находится в / whics / t99 / bin

Однако, при выполнении приведенных ниже команд, чтобы я не получил эту ошибку

server:~ su - whics

server:/whics/t99 cd ./wv.4gm/wv99b.4gs

server:/whics/t99/wv.4gm/wv99b.4gs nohup ./wv99b.sh -s 1 -m u -sleep 5 &

server:/whics/t99/wv.4gm/wv99b.4gs nohup: ignoring input and appending output to `/home/whics/nohup.out'

[1] +  Done                    nohup ./wv99b.sh -s 1 -m u -sleep 5 &

server:/whics/t99/wv.4gm/wv99b.4gs cat /home/whics/nohup.out Mon Sep 17 12:27:40 AEST 2018 : Start wv99b

wv99b.sh

#!/bin/ksh
# Copyright (C) 1992-1997 Wacher Pty. Limited
# Sccsid: %Z% %M%%Y% %Q%%I% %E%
myname=${0##*/}     # a useful identifying variable
mydir=${0%$myname}      # where this script is
vSFX=${myname##*.}

. wh_setENV.sh # P4813 - when using 4js:WebServices, the $fglidir/lib in LD_LIBRARY_PATH causes problems

test $debugxv && set -xv

#--------------------------------------------------------------------------------------------------------------------------------------#
wv99b_msg() {
vERR="`date` : ${vMSG}"
echo $vERR | tee -a ${vLOG}
}
#--------------------------------------------------------------------------------------------------------------------------------------#
wv99b_sysFragments() {

vSYSFRAGOK="0"
vSYSFRAGMENTS="${vTABNAME}.sysfrags.unl" ; rm -f $vSYSFRAGMENTS
$WH_ISQL $company - <<! 2>/dev/null | sed "/exprtext/d;/^$/d;s/ //g;s/[()]//g" |cut -f1 -d'=' >| ${vSYSFRAGMENTS}
select F.exprtext 
from systables S, sysfragments F
where S.tabid   > 99
and   S.tabtype = "T"
and   S.tabname = "${vTABNAME}"
and   S.tabid   = F.tabid
and   S.tabtype = F.fragtype
and   F.evalpos = 0
;
!

if  [ -s ${vSYSFRAGMENTS} ] ; then
    # search for the vCOLUMN in the vSYSFRAGMENTS output
    vSYSFRAGOK=`grep -i ${vKEY} ${vSYSFRAGMENTS} 2>/dev/null | wc -l | awk '{print $1}'`
else
    vSYSFRAGOK="0"
    rm -f ${vSYSFRAGMENTS}   # cleanup
fi

}
# MAIN #
vARGS="$@"
vHERE=`pwd`
vLOG="${vHERE}/errlog"

vD=0           # debug indicator
vI=0           # infile indicator
vQ=0           # email indicator
vM=0           # mode indicator
vS=0           # serial indicator
vNO_MULTI=0    # default to false
vNO_PROGI=0    # default to false
vTABLE=0       # default to 0
vSLEEP=5       # default to 0

for i in $vARGS
do
case "$i" in
       -debug) vD=$2          ;;
      -infile) vI=$2          ;;
       -table) vTABLE=$2      ;;
       -sleep) vSLEEP=$2      ;;
    -no_multi) vNO_MULTI=$2   ;;
    -no_progi) vNO_PROGI=$2   ;;
           -m) vM=$2          ;;
           -q) vQ=$2          ;;
           -s) vS=$2          ;;
esac
shift

done

[[ ${vS} -eq 0 ]] && vMSG="-s parameter not supplied" && wv99b_msg && exit 1

vHERE=`pwd`

if  [ ${vD} -eq 1 ] ; then
    vDEBUG=" -debug 1"
else
    vDEBUG=""
fi

if  [ ${vI} -eq 0 ] ; then
    vINFILE="wv99b.in"
else
    vINFILE="${vI}"
fi

# INIT
vWVI="wv99b_I"   # the name of the (I)dentify script
vWVIS="${vWVI}_${vS}"   # the name of the (I)dentify script PLUS SERIAL
vWVIO="${vWVIS}.unl"   # the name of the (I)dentify script

rm -f ${vWVIO}

# Check that transaction-logging is off

# check that vINFILE exists
if  [ ! -s "${vINFILE}" ] ; then
    vMSG="Error cannot read input file $vINFILE" ; wv99b_msg ; exit 1
fi

# Process only one(1) table
if  [ ${vTABLE} != "0" ] ; then
    vTABLE_FILTER=" -table ${vTABLE} "
else
    vTABLE_FILTER=""
fi

# We need to check if we are running client/server
#
vDB=`echo $company | awk 'BEGIN {FS="@" } { print $1 }'`
vDBSRV=`echo $company | awk 'BEGIN {FS="@" } { print $2 }'`

case X${vDBSRV}X in
  XX) vREMOTE_DB="" ;;
   *) vREMOTE_DB=" -db ${vDB}  -dbsrv ${vDBSRV} " ;;
esac
#_end

vMSG="Start  wv99b" ; wv99b_msg

Итак, в файле wv99b.sh я изменил

. wh_setENV.sh
to
. /whics/t99/bin/wh_setENV.sh

Однако теперь я получаю ошибку не может прочитать входной файл wv99b.in

Я проверил wv99b.in, и он находится в том же каталоге, что и 'wv99b.sh' (т.е. /whics/t99/wv.4gm/wv99b.4gs/)

wh_setENV.sh

#!/usr/bin/ksh

test $debugxv && set -xv

trap door 1 2 3 5 9 15

#---------------------------------------------------------------------#
door() {
    echo "`date` ERROR($?) occured in $0" >> $WH/batch.4gm/trap.log
} #end door
#---------------------------------------------------------------------#

# Script to set Environment variables for various scripts

# Stef

# Unix specific


umask 002

: ${WH:="/whics/prod"}

set -a
TERM=xterm
vHERE=`pwd`
TERMCAP=$WH/etc/termcap
vHOST=`hostname | cut -f1 -d'.'`
set +a

#LD_LIBRARY_PATH="$WH/lib.4gm/S_lib:$fglibdir/S_lib"    # GUC R481
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INFORMIXDIR/lib/c++:$INFORMIXDIR/lib/cli:$INFORMIXDIR/lib/client:$INFORMIXDIR/lib/csm:$INFORMIXDIR/lib/dmi"

LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/tools.$CCODE" 

export LD_LIBRARY_PATH

# EOF #

1 Ответ

0 голосов
/ 17 сентября 2018

ОБНОВЛЕНИЕ: После того, как ОП изменил / обновил вопрос ...

  • wv99b.in указано в wv99b.sh
  • вы не указали путь для wv99b.in, поэтому ...
  • , если вы вызываете wv99b.sh из другого каталога, кроме /whics/t99/wv.4gm/wv99b.4gs ...
  • при запуске теста [ ! -s "${vINFILE}" ] ваш скрипт (правильно) определяет, что "${vINFILE}" не находится в каталоге, в который вы вызвали wv99b.sh из

Чистый результат ... исходная проблема с sh_setENV.sh была исправлена, но теперь точно такая же проблема возникает для wv99b.in, с тем же решением, которое необходимо здесь ... вызвать wv99b.sh из его домашнего каталога или предоставить полный путь к wv99b.in.


ОРИГИНАЛЬНАЯ ПОЧТА:

Расширение комментария Андре ...

В wv99b.sh у вас есть следующая строка:

. wh_setENV.sh

Это будет искать wh_setENV.sh в каталоге, откуда вызывается wv99b.sh.

В исходном примере вы указали полный путь к wv99b.sh, но вопрос в том ... из какого каталога вызывается этот вызов? Мы можем сказать по ошибке ...

wh_setENV.sh: cannot open [No such file or directory]

... что wv99b.sh не было вызвано из /whics/t99/wv.4gm/wv99b.4gs, иначе он нашел бы wh_setENV.sh.

Из вашего второго примера видно, что полный путь к wh_setENV.sh: /whics/t99/wv.4gm/wv99b.4gs/wh_setENV.sh, поэтому у вас есть пара опций:

  • в исходном примере убедитесь, что вы cd /whics/t99/wv.4gm/wv99b.4gs перед выполнением wv99b.4gs

или

  • обновить wv99b.4gs, указав полный путь к местоположению sh_setENV.sh, например:

    . /whics/t99/wv.4gm/wv99b.4gs/wh_setENV.sh

...