Скрипт Bash, неправильно включающий \ r в переменную - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть скрипт установки среды, который я создаю в контейнере Docker. Он берет файл свойств, представляющий собой пары ключ = значение, а затем просматривает их и использует для создания среды. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь сократить пользователя (значение, полученное из свойств), оно отображается как «user \ r», что вызывает ошибку на chown.

Это выполняется в среде докера, которую я подготовил - CentOS: 7 base. Идентификатор пользователя из файла свойств извлекается, создается как пользователь в контейнере и получает доступ к группе колес (usermod -aG wheel $ user), поэтому у них есть разрешения в контейнере.

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

#!/bin/bash

dirname=$(dirname $0)
input_properties="input-properties"
...
while read -r line; do declare -x "$line"; done <${dirname}/${input_properties}
...
$SUDO mkdir -p $log
...
$SUDO chown -R $app_user: $log

где $ app_user и $ log из файла входных свойств:

app_user=stackoverflow
log=/opt/program-root/logs

и ошибка

chown: invalid spec: 'stackoverflow\r:'

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Ваш файл имеет окончания строки в стиле Windows.Самое простое решение:

dos2unix ./${input_properties}
1 голос
/ 26 апреля 2019

Просто скажите read команду, что \r является частью Разделителей полей ввода

while IFS=$' \t\r\n' read -r line; do ...

Это намного быстрее, чем при использовании перевод и выигрализменить исходный файл.

...