У меня есть скрипт 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: $'[email protected]\r': command not found
Он помещает туда карету, \r
.
Как я могу разбить эту линию и не включать возврат каретки?
Так что я понял это... Я ошибся в этом вопросе, и у меня есть такая потрясающая помощь, но это я сделал тупую вещь, которая вызвала проблему. Как я уже упоминал выше, я, возможно, скопировал и вставил из Windows в какой-то момент (я забыл, так как сделал большинство изменений в vim). Я вернулся и написал короткий сценарий с основами оригинала в vim, а затем добавил в '\' для разрыва строки, и скрипт работал нормально. Я чувствую себя плохо, принимая свой собственный ответ, потому что это было так глупо. Я позаботился о всех, кто помогал мне. Еще раз спасибо.
Проблема выглядит как окончание строк Windows.
Здесь вы можете проверить Python.
repr(open('rsync.sh', 'rb').read())
# If you see any \\r\\n, it windows
Вот как вы можете это исправить:
text = open('rsync.sh', 'r').read().replace('\r\n', '\n')
open('rsync.sh', 'wb').write(text)
Вот какой код, который показывает проблему.
# 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
Если вы можете chnage скрипт python, возможно, будет проще передать ему имена переменных, а не их содержимое.
Из кода Python вы получите более эффективные и более последовательные инструменты для обработки пробельных символов (например,\r), чем из bash.
Для этого просто измените вашу строку.sh на
python/path/to/rsync_script.py EMAIL "RSYNC PATH1 PATH1_BACKUP"
И на вашем rsync_script.py используйте os.environ для чтения содержимого переменных оболочки (и очистите их в них) - что-то вроде:
import os, sys
paths = []
for var_name in sys.argv(2).split(" "):
paths.append(os.environ[var_name].strip())
python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"
вами строку, python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"
уже является тем, что у меня было (см. Оригинальный пост) ... Именно так я сейчас и заставляю его работать.
$
, а не их содержимого. Исправляю сейчас.