Переменные скрипта ksh в nohup работают по-другому

У меня есть сценарий под названием cmdtst_multi.ksh, и когда я запускаю его так:

. ./cmdtst_multi.ksh

У меня есть переменная, которая заполняется следующим образом;

treeLvls=$(td_query {})

echo "num of tree lvls:" $treeLvls
##gives back num of tree lvls: 4

treeLvlsSQL=$(for i in {1..$treeLvls}
    do 
    echo ",NULL as LVL$i" 
    done)

echo "tree sql:" $treeLvlsSQl
#gives back tree sql: ,NULL as LVL1 ,NULL as LVL2 ,NULL as LVL3 ,NULL as LVL4

он работает нормально

но когда я запускаю это так:

nohup cmdtst_multi.ksh > prcsstst.log &

treeLvlsSQl отображается в файле журнала следующим образом, что неверно:

tree sql: ,NULL as LVL{1.. ,NULL as LVL4}

почему кажется, что переменные работают по-другому?


person lightweight    schedule 21.11.2014    source источник
comment
Может быть проблема в том, что nohup скрипт запускается не с ksh, а с чем-то другим?   -  person Jonathan Leffler    schedule 21.11.2014
comment
Начните свой сценарий с #!/bin/ksh и посмотрите, прав ли Джонатан. Поддерживает ли ваш ksh конструкцию for i in {1..5} !?   -  person Walter A    schedule 28.11.2014


Ответы (1)


Я предполагаю, что это различие как-то связано с кажущимся безобидным оператором поиска (.) или оператором текущего каталога (./) в начале вашего скрипта.

  1. nohup - не зависает, чтобы процесс не зависал при выходе пользователя из системы
  2. > prcsstst.log & - перенаправляет в файл журнала и фоновый процесс

что исключает их как претендентов на разницу в производительности.

Пожалуйста, попробуйте nohup с оператором поиска, как показано ниже:

nohup ksh93 -c ". ./cmdtst_multi.ksh" > prcsstst.log

. и ./ важны . подразумевает получение текущей оболочки, которая предотвращает порождение отдельной дочерней оболочки с новым набором переменных среды, а ./ подразумевает, что сценарий в . (текущий каталог) выполняется вместо какого-либо другого сценария с тем же именем, определенным в $PATH.

Изменить: как указывает Джонатан Леффлер в своем комментарии, это также может быть связано с тем, что KSH не используется nohup (KSH, возможно, не является оболочкой по умолчанию?), Что может объяснить, почему синтаксис KSH FOR работал изначально, когда исходный (.) из текущей оболочки (KSH?) Но не во второй раз (какой-то другой тип оболочки).

person toddlermenot    schedule 21.11.2014
comment
поэтому, когда я запускаю его вот так ... я получаю сообщение об ошибке, что nohup не может запустить. команда ... Я выполнил команду chmod 755 для своего файла, этого достаточно? - person lightweight; 06.12.2014
comment
Прости за это. Похоже, nohup ожидает, что первым аргументом будет имя файла. Кроме того, nohup и . не работают вместе, поскольку nohup в любом случае порождает новую оболочку. Я отредактировал команду, которая не тестировалась, так как у меня нет оболочки здесь. Отредактированная команда, если она работает, все равно порождает новую оболочку, которая нарушит цель поиска. По крайней мере, вы можете быть уверены, что он был выполнен Ksh, а не какой-то другой оболочкой. - person toddlermenot; 06.12.2014