linux
  • bash
  • shell
  • 2016-07-27 4 views 0 likes 
    0

    Я хочу получить возвращаемое значение команды run в фоновом режиме с помощью pipe, поэтому у меня есть пример кода.Получить возвращаемое значение запуска команды в фоновом режиме с помощью команды pipe и tee

    #!/bin/bash 
    
    export RETVALUE="0" 
    CMD='ls ThisFileDoesNotExit' 
    LOG='tee -a log.txt' 
    $CMD | $LOG ; RETVALUE=${PIPESTATUS[0]} & 
    #$CMD | $LOG ; echo ${PIPESTATUS[0]} & // This print ret value 2 
    wait 
    echo "Return Value of ls is $RETVALUE" 
    

    Выход:

    Return Value of ls is 0 // It should print value 2 
    

    Если я эхо возвращаемого значения из тех же команды, то распечатать правильное значение возврата.

    Но если сохранить его в переменной RETVALUE, то он показывает неправильное значение.

    +1

    Это? [shell - получить код выхода фонового процесса] (http://stackoverflow.com/a/1570356/1983854). То есть '$!' – fedorqui

    +1

    вы уже храните его в переменной: RETVALUE. Нет ничего, что помешает вам присвоить значение этой переменной другому 'var = $ RETVALUE' – SaintHax

    +0

    @SaintHax. При назначении этого способа $ RETVALUE всегда печатает« 0 », а значение возврата ошибки равно 2. См. Обновленный вопрос. –

    ответ

    4

    Проблема возникает из-за знака &. Это ставит назначение RETVALUE в фоновом режиме, поэтому эта команда выполняется в другой среде, чем текущий скрипт, поэтому переменные в вашем скрипте не обновляются.

    Вам также не нужно экспортировать RETVALUE. Также команда wait не является необходимым, так как баш не обрабатывает следующую команду до тех пор, пока не закончится предыдущий (если вы не используете &, чтобы положить его в фоновом режиме)

    #!/bin/bash 
    
    RETVALUE="0" 
    CMD='ls ThisFileDoesNotExit' 
    LOG='tee -a log.txt' 
    $CMD | $LOG 
    RETVALUE=${PIPESTATUS[0]} 
    echo "Return Value of ls is $RETVALUE" 
    

    EDIT: Если вам нужно запустите процесс в фоновом режиме, вы будете вынуждены создать новый скрипт, чтобы восстановить значение PIPESTATUS, поскольку эта переменная является изменчивой. Возможное решение:

    #!/bin/bash 
    
    CMD='ls ThisFileDoesNotExit' 
    LOG='tee -a log.txt' 
    TMPSCRIPT="file1.sh" 
    echo '#!/bin/bash' > $TMPSCRIPT 
    echo "$CMD |$LOG" >> $TMPSCRIPT 
    echo 'exit ${PIPESTATUS[0]}' >> $TMPSCRIPT 
    chmod +x $TMPSCRIPT 
    ./$TMPSCRIPT & 
    MYPID=$! 
    wait $MYPID 
    RETVALUE=$? 
    rm $TMPSCRIPT 
    echo "Return Value of ls is $RETVALUE" 
    
    +0

    Мне нужно запустить целую commnad в фоновом режиме, так что я положил &. Без & его работы отлично, но мне нужно сделать то же самое для фона –

    +0

    @JeegarPatel Я отредактировал ответ – AwkMan

    +0

    Да, человек ... он работает так, как я хотел ... позвольте мне искать любое другое решение, если возможно тогда. В противном случае я приму ваш ответ. –

    Смежные вопросы