Как красиво отформатировать python-скрипт, который вызывается в bash скрипте?

У меня есть такой код:

if [[ $ENABLE_DIND == 1 ]]; then

        python3 <<EOF
import pathlib
import subprocess
import time

path = pathlib.Path('/var/run/docker.sock')
while not path.exists():
  time.sleep(0.01)
try:
  subprocess.call(['chmod', '0666', '/var/run/docker.sock'])
except Exception as e:
  print(e)
EOF

fi;

Мне не нравится как отформатирована часть, которая вызывает Python-код. Но при этом любые попытки навести красоту, приводят к тому, что bash ругается на синтаксис.


Ответы (1 шт):

Автор решения: Fat-Zer

Можно просто оставить и смирится. Форматирование встроенных документов с начала строки — вполне привычная вещь для bash'а.

Можно также использовать <<- и табами для отбивки отступов:

if [[ $ENABLE_DIND == 1 ]]; then
    python3 <<-EOF
        import pathlib
        import subprocess
        import time

        path = pathlib.Path('/var/run/docker.sock')
        while not path.exists():
          time.sleep(0.01)
        try:
          subprocess.call(['chmod', '0666', '/var/run/docker.sock'])
        except Exception as e:
          print(e)
        EOF
fi

Внимание: здесь отступы встроенного документа должны быть отбиты именно символами табуляции (\t), а код питона — пробелами. Данное различие на сайте может отображаться некорректно.


Но в данном случае всё это намного проще будет сделать сразу на bash'е:

if [[ $ENABLE_DIND == 1 ]]; then

  while [ ! -e /var/run/docker.sock ]; do
    sleep 0.01
  done

  chmod 0666 /var/run/docker.sock
fi

Также вместо тупого ожидания файла можно было бы сделать это с помощью чего-то более технологичного вроде inotify (если дело на linux), но в данном случае это не даст особых преимуществ...

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

→ Ссылка