bash — передача переменной в строку в файле оболочки

#python #bash

#python #bash

Вопрос:

Я пытаюсь запустить команду docker через скрипт bash, но я не могу правильно передать аргументы.

По сценарию bash выполняется:

 #!/bin/bash

start=$(date -d '13 hours ago' ' %Y-%m-%d %H')
end=$(date -d '12 hours ago' ' %Y-%m-%d %H')

docker run --rm -v /home/basic/buffer/:/home psycopg2 /bin/sh -c 'python /home/config.py  ${start} ${end} ' > /home/basic/result

  

и мой скрипт на python (config.py ):

 import psycopg2
import datetime
import sys

start = "%s" % (sys.argv[1])
end = "%s" % (sys.argv[2])

print("start:",start)
print("end:",end)

  

Но он печатает пустые строки.

Есть идеи?

Комментарии:

1. Изменить ‘python /home/config.py ‘ «${start}» «${end}» > /home/basic/результат в «python /home/config.py ‘$start’ ‘$end'» > /home/basic/результат»

Ответ №1:

Вам не нужна дополнительная оболочка; просто укажите расширения параметров, чтобы docker run получить правильные аргументы; они будут переданы непосредственно в Python, не подвергаясь какой-либо дальнейшей обработке оболочки. в стороне контейнера.

 #!/bin/bash

start=$(date -d '13 hours ago' ' %Y-%m-%d %H')
end=$(date -d '12 hours ago' ' %Y-%m-%d %H')

docker run --rm -v /home/basic/buffer/:/home psycopg2 
  python /home/config.py "${start}" "${end}" > /home/basic/result
  

Краткий пример:

 % docker run --rm bash /usr/bin/printf '%sn' "a b" "c d"
a b
c d
  

printf получает три аргумента, а не пять. Внутри контейнера нет команды, подобной printf %sn a b c d той, которая создается.

Комментарии:

1. Я не получаю ошибку при таком подходе, но перенаправление, похоже, не работает, поскольку /home/basic/result это пустой файл — @chepner