Bash скрипт, обновить вывод после завершения команды - PullRequest
1 голос
/ 23 октября 2019

Я пробовал разные способы, но ни один из них не работал до сих пор.

echo "Starting"

checklocation(){
if (command blabla)

then locationOne=$"Found"

else locationOne=$"Not found"

fi

}
checklocation &

echo "Let's check: " $locationOne

echo "Ending"

Поскольку моей команде требуется много времени для предоставления результатов, я хотел бы продолжить печать всех выходных данных и показать значение $ locationOne, как только результат будет готов. Следующий код работает нормально, печатая все выходные данные одновременно, но $ locationOne не появляется. Я попытался с printf и тоже без удачи. Любые предложения?

Чтобы уточнить, я хотел бы загрузить значение переменной, куда указывают стрелки после завершения команды

Link to the image

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Вы можете использовать wait для ожидания изменения статуса дочернего процесса. (отметьте man wait)

#for demo puposes , I have manually added sleep of 10 sec. 
long_running_command()
{
sleep 10
echo "Hey, I am long running command....uh"
}

long_running_command &                 #<-using & to send this function to BG
echo "I am normal command"
wait                                   #waiting till the child is terminated. 

Приведенный выше сценарий приведет к следующему выводу:

I am normal command
Hey, I am long running command....uh
0 голосов
/ 23 октября 2019

Вы хотите вернуться и изменить вывод на экран позже.

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

В этом примере это делается путем предварительной очистки экрана, так что любой дополнительный вывод вряд ли будет прокручиваться. Затем он может обновлять по координатам:

#!/bin/bash

check() {
  sleep 3
  tput sc        # Save cursor
  tput cup 1 14  # Set y,x coordinates
  printf '%s' "Found"
  tput rc        # Restore cursor
}
check &
clear # Clear screen so we know where we are
echo "Starting"
echo "Let's check: "
echo "Ending"
wait

Это показывает:

Starting
Let's check:  
Ending

в течение трех секунд, а затем обновляет его до:

Starting
Let's check:  Found
Ending

Альтернативные подходы включают:

  • Сохранение нужных данных на экране в виде строки и просто очистка + запись всякий раз, когда вы хотите обновить полноэкранный режим
  • Отслеживание количества строк, которые вы пишете, затем использованиеANSI-команду «курсор вверх» (tput cuu), чтобы подняться туда, где, по вашему мнению, будет строка для исправления.
0 голосов
/ 23 октября 2019
echo "Starting"

checklocation(){
if (command blabla)
then
locationOne="Found"
else 
locationOne="Not found"
fi
}
echo "Calling function"
checklocation
echo "Let's check: " $locationOne
echo "Ending"

попробуйте выполнить указанные выше исправления,

Удалите « $ » при назначении переменной locationOne

Также при вызовефункция remove " & ", игнорируйте это, это считается аргументом.

Goodluck !!

...