Запуск сценариев оболочки с ./ точка-слэш

Я работаю над проектом обработки файлов и пытаюсь запустить сценарий оболочки с именем runProcessing.sh в PuTTY. Сервер использует ksh. Мой руководитель сказал мне использовать ./ runProcessing.sh <param1> <param2> при выполнении сценария, но всякий раз, когда я использую ./, он говорит либо cannot execute, либо file not found. Всякий раз, когда я вставляю только runProcessing.sh, он возвращает исключения с нулевым указателем, над которыми я сейчас работаю, чтобы продолжить свою задачу.

Я понимаю, что делает ./ при запуске скриптов, но я не уверен, почему он не работает, когда я пытаюсь запустить с ним свой скрипт. Любые советы или советы? Я новичок в Linux/UNIX.

Вот мой сценарий:

#!/bin/ksh
#
# Script to download processing files from the appropriate target
#
# $Id: runProcessing.sh 604 2013-01-14 21:56:35Z alex_rempel $
#

DIR=`dirname $0`
. $DIR/setEnvironment.sh
java $LDAPRUNMODE $JAVAOPT com.webproject.db.processing.FPJob  --logdir $CISLOGDIR --file [2] $* 
RET=$?

if [ $RET -gt 0 ]
then
    echo
    echo
    echo "------ runProcessing.sh Failed ------"
    echo
    echo
    exit $RET

person superdiazepam    schedule 02.07.2013    source источник
comment
./something (указание текущего каталога как места для поиска чего-либо) и . something (запуск чего-либо в текущей оболочке, а не в качестве подпроцесса) имеют смысл. ./ something недопустимое использование.   -  person Charles Duffy    schedule 02.07.2013
comment
...кстати, ваш сценарий недействителен, потому что в нем есть if без fi. Вы также должны заключать свои расширения в кавычки и не должны использовать $? — здесь нет смысла. if ! java ...; then ...; fi достаточно, нет причин хранить $RET. Кроме того, использование заглавных букв для чего-либо, кроме переменных среды и встроенных функций, является плохим тоном. (Рассчитывать на разбиение строк, чтобы позволить людям передавать списки аргументов, особенно дурной тон, но это почти повсеместно встречается среди скриптов, запускающих Java-приложения... почти все они написаны людьми, которые не малейший намек на оболочку).   -  person Charles Duffy    schedule 02.07.2013
comment
Хорошо, в свою защиту, я смоделировал свой сценарий на основе аналогичного сценария для аналогичного процесса в сборке моей компании, так что простите меня за дурной тон.   -  person superdiazepam    schedule 03.07.2013


Ответы (2)


Исключения нулевого указателя исходят от вашей Java-программы, поэтому они означают, что процесс фактически был запущен. Как правило, они не указывают на проблему с вашим сценарием оболочки или его вызовом.

. something # this reads the file `something`, running each line as a command
            # in your current shell. (Actual behavior is a bit more sophisticated
            # than that, but it's close enough).

./something # this tries to run the file `something` in the current directory as
            # an executable. It doesn't need to be a shell script -- it can be
            # any kind of executable, and if it has a shebang line, that will be
            # honored to determine the interpreter or shell to use.

./ something  # <- this is simply invalid.

Тем не менее, вы можете точно записать, какие команды выполняет ваш скрипт, запустив его так:

ksh -x ./something

Это отобразит команды, которые запускает ваш скрипт. Если ошибка вызвана неправильным запуском JVM сценарием, вы можете таким образом определить, чем отличаются ожидаемые и фактические вызовы.

person Charles Duffy    schedule 02.07.2013
comment
Это помогло мне выяснить, было ли что-то не так в сценарии, и оказалось, что, если не считать отсутствия fi в конце оператора if, все в порядке (достаточно). Сейчас я в основном разобрался со своей проблемой, я не передал правильные параметры сценарию, когда выполнял его. Спасибо! - person superdiazepam; 03.07.2013

Поскольку вы работаете в среде ksh, у вас есть еще один вариант использования оператора ./.

Вместо того, чтобы делать ваш скрипт исполняемым, вы можете выполнить его, передав его в качестве аргумента ksh, например:

ksh yourScript

Когда вы создаете файл в Unix/Linux, ему автоматически не дается разрешение на выполнение. Поэтому в качестве альтернативы вы можете изменить разрешения вашего скрипта, используя chmod:

chmod +x yourScript

После этого вы сможете выполнить свой скрипт.

person Bts    schedule 02.07.2013