Переменная Bash содержит '\ r' - проблемы с возвратом каретки в моем скрипте - PullRequest
1 голос
/ 08 декабря 2011

У меня есть скрипт bash (rsync.sh), который работает нормально и содержит следующую строку:

python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"

Я хочу прервать команду (на самом деле это намного дольше, чемпоказано здесь, потому что мои переменные имеют более длинные имена) в два и используют что-то вроде этого:

python /path/to/rsync_script.py \
$EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"

Но когда я делаю это, я получаю ошибку:

scripts/rsync.sh: line 32: $'admin@mydomain.com\r': command not found

Он вставляет туда возврат каретки, \r.

Как можно разбить эту строку и не включать возврат каретки?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Проблема выглядит как конец строки в Windows.

Вот как вы можете проверить это в Python.

repr(open('rsync.sh', 'rb').read())
# If you see any \\r\\n, it's windows

Вот как вы можете это исправить:

text = open('rsync.sh', 'r').read().replace('\r\n', '\n')
open('rsync.sh', 'wb').write(text)

Edit

Вот некоторый код, который показывает проблему.

# Python:
open('abc-n.sh', 'wb').write('echo abc \\' + '\n' + 'def')
open('abc-r-n.sh', 'wb').write('echo abc \\' + '\r\n' + 'def')

А затем запустите файлы, которые мы сделали ...

$ sh abc-n.sh 
abc def
$ sh abc-r-n.sh 
abc 
abc-r-n.sh: 2: def: not found
1 голос
/ 08 декабря 2011

Если вы можете изменить скрипт python, возможно, будет проще передать ему имена переменных, а не их содержимое.

Из кода Python у вас есть лучшие и более согласованные инструменты для работы с символами пробела (например, \ r), чем изнутри bash.

Для этого просто измените строку .sh на

python /path/to/rsync_script.py EMAIL "RSYNC PATH1 PATH1_BACKUP"

А в вашем rsync_script.py используйте os.environ, чтобы прочитать содержимое переменных оболочки (и очистить \ r в них) - что-то вроде:

import os, sys
paths = []
for var_name in sys.argv(2).split(" "):
     paths.append(os.environ[var_name].strip())
0 голосов
/ 10 декабря 2011

Итак, я понял это ... Я допустил ошибку в этом вопросе, и мне очень помогли, но именно я сделал глупость, которая и стала причиной проблемы. Как я упоминал выше, я мог скопировать и вставить из Windows в какой-то момент (я забыл, так как делал большинство изменений в vim). Я вернулся и написал короткий сценарий с основами оригинала в vim, а затем добавил в '\' для разрыва строки, и сценарий работал просто отлично. Я чувствую себя плохо, принимая свой собственный ответ, так как он был настолько глуп. Я сделал все возможное, чтобы проголосовать всем, кто мне помог. Еще раз спасибо.

...