Клавиши со стрелками внутри скрипта bash создают странные буквы - PullRequest
0 голосов
/ 22 октября 2019

Доброе время суток,
Я написал простой скрипт для управления контейнерами внутри моего приложения, однако всякий раз, когда я нажимаю клавиши со стрелками, они выдают что-то вроде [[A или других символов. Не могли бы вы помочь мне решить проблему?

Пример команды: ./service.sh app shell, которая откроет оболочку моего приложения Laravel внутри контейнера Docker.

#!/usr/bin/env bash

#application=$(basename "$PWD")
application="plexmediamanager"

services=("app", "roadrunner", "scheduler", "frontend", "nginx", "redis", "database", "queue", "torrent", "jackett", "traefik")
actions=("start", "stop", "restart", "shell", "rebuild")

if [[ ! "${services[@]}" =~ "${1}" ]]; then
    echo "Unknown service: ${1}"
    printf -v servicesString "%s" "${services[@]}"
    echo "Available services: ${servicesString}"
    exit 0
fi

if [[ ! "${actions[@]}" =~ "${2}" ]]; then
    echo "Unknown action: ${2}"
    echo "Available actions: start|stop|restart|shell|rebuild"
    exit 0
fi

case "$2" in
    "start")
    docker-compose start $1
    ;;
    "stop")
    docker-compose stop $1
    ;;
    "restart")
    docker-compose restart $1
    ;;
    "shell")
    docker exec -it "${application}_${1}" /bin/sh
    ;;
    "rebuild")
    docker-compose stop $1
    docker-compose build $1
    docker-compose start $1
    ;;
esac

1 Ответ

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

Как упоминалось в комментариях, оболочка, которую вы вызываете в своем операторе case, не закрывается и не имеет функций прокрутки истории, как вы привыкли в bash. Возможно, вы сможете заставить эту оболочку завершиться, используя что-то вроде этого:

docker exec -it "${application}_${1} && exit" /bin/sh

Но это всего лишь непроверенное предположение.

Конечно, если вы прекратите вызов другой оболочки (и позволите сценарию выполнить эту команду в родительской оболочке), вы можете сохранить свой сценарий в ожидании ввода новой команды, разрешив ввод данных пользователем через readи укладывая это внутри while петли.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...