Разница, конечно, между источником и разветвлением заключается в том, что источник приводит к тому, что вызываемый сценарий выполняется в вызывающем процессе.Хенк показал элегантное решение в ksh93, но если, как и я, вы застряли на ksh88, то вам нужна альтернатива.Я бы не стал менять метод поиска по умолчанию ksh с использованием синтаксиса C-shell, и на работе это противоречило бы нашим стандартам кодирования, поэтому создание и использование функции source () для меня было бы неработоспособным.ps, $ 0 и $ _ ненадежны, поэтому есть альтернатива:
$ cat b.sh;кошка c.sh;./b.sh
#!/bin/ksh
export SCRIPT=c.sh
. $SCRIPT
echo "PPID: $$"
echo "FORKING c.sh"
./c.sh
Если мы установим вызываемый скрипт в переменную и создадим его с помощью переменной, эта переменная будет доступна для вызываемого скрипта, поскольку они находятся в одном пространстве процесса.
#!/bin/ksh
arguments=$_
pid=$$
echo "PID:$pid"
command=`ps -o args -p $pid | tail -1`
echo "COMMAND (from ps -o args of the PID): $command"
echo "COMMAND (from c.sh's \$_ ) : $arguments"
echo "\$SCRIPT variable: $SCRIPT"
echo dirname: `dirname $0`
echo ; echo
Вывод выглядит следующим образом:
PID:21665
COMMAND (from ps -o args of the PID): /bin/ksh ./b.sh
COMMAND (from c.sh's $_ ) : SCRIPT=c.sh
$SCRIPT variable: c.sh
dirname: .
PPID: 21665
FORKING c.sh
PID:21669
COMMAND (from ps -o args of the PID): /bin/ksh ./c.sh
COMMAND (from c.sh's $_ ) : ./c.sh
$SCRIPT variable: c.sh
dirname: .
Таким образом, когда мы устанавливаем переменную SCRIPT в скрипте вызывающего абонента, переменная либо доступна из операндов исходного скрипта, либо вВ случае разветвленного процесса переменная вместе со всеми другими переменными среды родительского процесса копируется для дочернего процесса.В любом случае переменная SCRIPT может содержать вашу команду и аргументы и будет доступна как в случае получения, так и разветвления.