Команда wait оставляет терминал в странном состоянии, печатая пробелы в каждой строке - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть сценарий bash, который выполняет некоторые задания в фоновом режиме и печатает вывод этих заданий с помощью команды ожидания, изменяя журнал вывода. Иногда после выполнения сценария терминал работает нормально, но часто случается, что терминал завершает работу в странном состоянии, печатая много пробелов в каждой строке. Что может вызвать эту проблему?

Ниже приведен сценарий

#!/bin/bash

SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# Capture all runnning containers.
database_container=`docker-compose images | sed -n '1,2!p' | cut -f 1 -d ' ' | grep -e database`
containers=`docker-compose images | sed -n '1,2!p' | cut -f 1 -d ' ' | grep -v database`

if [ -z "$containers" ] ; then
  echo "You need to create the containers first. Execute './chf up'"
  exit;
fi

# Wait until MySQL is running to start installation.
# Do not start installation until database service is running.
echo "Waiting for database in container \"${database_container}\" to become active..."
while ! docker exec ${database_container} mysql --user=db --password=db --host "127.0.0.1" -e 'status' &> /dev/null ; do
    echo "Waiting for database connection..."
    sleep 2
done
echo "Database service active, starting Site installation."

# Separating list of containers in lists of 3 containers to be processed in parallel.
num_containers=`echo $containers | wc -w`
rest=$(($num_containers % 3))
if [ $rest != 0 ] ; then
  limit=$(($num_containers/3))
else
  limit=$(($num_containers/3 - 1))
fi

# Starting installation 3 containers at a time.
containers_list=$containers
for ((i=0; i<=$limit; i++)) {
  P[1]=""; P[2]=""; P[3]=""
  for ((j=1; j<=3; j++)) {
    container=`echo $containers_list | cut -f 1 -d ' '`
    if [ -z "$container" ]; then break; fi;
    print_logs=true
    containers_list=`echo $containers_list | awk '{ $1=""; print substr($0,2) }' `
    docker exec -it $container docker-entrypoint.sh | awk -v c="$container" -v j=$(($j+1)) '$0="\033[1;3"j"m" c " > \033[0m"$0' &
    P[$j]=$!
  }
  if [ $print_logs ]; then
    wait ${P[1]} ${P[2]} ${P[3]}
    print_logs=false
    sleep 1
    echo ""
  fi
}

echo "Environment is ready."

А ниже приведен пример того, что происходит в большинстве случаев после того, как сценарий завершает выполнение, с отключенным терминалом. Когда я выполняю любую команду, например «ls», это выглядит так. Есть идеи?

Сценарий вывода

...