2017-01-14 12 views
0

Я редактировал скрипт, и по мере того, как скрипт становился немного длинным, я решил приложить основную часть скрипта в фигурных скобках и перевести вывод в файл журнала вместо с индивидуальными переадресациями журналов для команд. Затем я заметил, что командный блок, который проверяет текущую копию скрипта, дает 2 разных результата в зависимости от того, заключен ли он в фигурные скобки.Различные результаты при запуске команд в фигурных скобках в скрипте bash

Я бегу сценарий как:

$ /bin/bash scriptname.bash

Мой вопрос, почему одни и те же команды блок возвращает 2 разные результаты, и, если это возможно, чтобы иметь команду заблокировать работу внутри скобок.

Ниже приводится блок команд:

#!/bin/bash 
#set -x # Uncomment to debug this shell script 
# 
########################################################## 
#   DEFINE FILES AND VARIABLES HERE 
########################################################## 
THIS_SCRIPT=$(basename $0) 
TIMESTAMP=$(date +%Y-%m-%d_%H%M%S) 
LOGFILE=process_check_$TIMESTAMP.log 

########################################################## 
#    BEGINNING OF MAIN 
########################################################## 

{ 
printf "%s\n" "Checking for currently runnning versions of this script" 

MYPID=$$ # Capture this scripts PID 
MYOTHERPROCESSES=$(ps -ef | \grep $THIS_SCRIPT | \grep -v $MYPID | \grep -v grep | awk '{print $2}') 

if [[ "$MYOTHERPROCESSES" != "" ]] 
    then 
    printf "%s\n" "ERROR: Another version of this script is running...exiting!" 
    exit 2 
    else 
    printf "%s\n" "No other versions running...proceeding" 
fi 

printf "%s\n" "Doing some script stuff..." 
exit 0 

} | tee -a $LOGFILE 2>&1 
# End of script 
+0

Чем отличается ваш вывод? Можете ли вы показать результаты или, может быть, попробовать. – Klaus

+0

Замечание: если вы хотите зарегистрировать как стандартную ошибку вывода _and_, перенаправление stderr должно произойти _before_ pipe (или использовать '| &' для канала). –

+0

@Klaus - в то время как в фигурных скобках блок показывает, что работает другой скрипт. Когда за пределами фигурных скобок блок правильно оценивает, что другой копии не работает. – martin

ответ

1

Это не из-за скобки, это связано с трубой.

При объединении команд с трубой, как command | tee, каждая сторона трубы выполняется в отдельном подпроцессе. Поэтому команды оболочки выполняются в под-оболочке. Вот эта суб-оболочка, которую вы обнаруживаете.

PS: избегать конструкций, как ps | grep -v grep, используйте pidof или pgrep вместо

+0

Спасибо за разъяснение. Я догадался, что существуют махинации с суб-оболочкой, так как PIDS отличаются количеством команд, которые были выгружены. Для меня приемлемо ваше предложение использовать 'pidof' и' pgrep'. Кроме того, я думаю, что достаточно здраво, чтобы просто переместить 2 переменные «MYPID» и «MYOTHERPROCESSES» за пределы фигурных скобок и связать их с остальными переменными. – martin

+0

@martin Ваш код внутри фигурных скобок выполняется в под-оболочке. Независимо от того, какое изменение вы внесете в свои переменные, не будет видно за пределами фигурных скобок. Чтобы выполнить код внутри фигурных скобок в текущей оболочке, измените '| tee -a $ LOGFILE 2> & 1' to '>> (tee -a $ LOGFILE) 2> & 1' (btw,' 2> & 1' должно быть помещено перед трубой в вашем коде) – xhienne

+0

на '2> & 1' бит, на котором вы находитесь, - вот как мой оригинальный сценарий является моей ошибкой в ​​приведенном выше представлении. Остальная часть моего скрипта внутри фигурных скобок делает не что иное, как тестирование различных условий с ранее объявленными переменными. Поэтому я счастлив, что тесты будут в отдельной оболочке. Однако я буду повторять каждый блок отдельно в фигурном скобке и из него, чтобы убедиться, что получаю ожидаемый результат. Спасибо за ваше время и помощь в этом. – martin