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

1

У меня есть скрипт 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.

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

  • 1
    Вы редактировали этот скрипт на компьютере с Windows?
  • 0
    Ну, нет, я на машине с Windows 7, но я ssh-ed (использую замазку) на машине с Linux, и я создал скрипт, используя vim.
Показать ещё 7 комментариев
Теги:
variables
carriage-return

3 ответа

0
Лучший ответ

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

2

Проблема выглядит как окончание строк 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
  • 0
    вопрос здесь не имеет никакого отношения к чтению файла.
  • 1
    Я думаю, что исходный код имеет неправильные окончания строк. Я предоставляю способ правильно отформатировать окончания строк. Приведенный выше код предназначен для однократного запуска в существующем файле. Я изменю имена файлов в примере на «rsync.sh».
Показать ещё 3 комментария
1

Если вы можете 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())
  • 0
    Программы работают нормально, если я не нарушу строку в скрипте оболочки. Используя python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP" вами строку, python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP" уже является тем, что у меня было (см. Оригинальный пост) ... Именно так я сейчас и заставляю его работать.
  • 0
    Извините - я набрал это неправильно здесь - я имел в виду передачу имен переменных без $ , а не их содержимого. Исправляю сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню