Ошибки в простом bash скрипте - PullRequest
0 голосов
/ 22 апреля 2020

Итак, у меня есть небольшой сценарий bash, который работает на моем пи, но по какой-то причине выбрасывает ошибки на пи друзей.

Конечной целью является файл, который нужно загрузить и переименовать быть использованным другим скриптом. Это происходит 4 раза в день, поэтому часть сценария удаляет предыдущий файл перед его запуском. Затем он загружает новый файл и затем переименовывает его, чтобы другой сценарий мог ссылаться на один файл вместо всех четырех, загружаемых в течение дня.

Вот сценарий.

#!/bin/bash

rm -r /NeoSectional/GFSMAV &
sudo wget https://www.weather.gov/source/mdl/MOS/GFSMAV.t00z -P /NeoSectional/
sleep 5
sudo mv /NeoSectional/GFSMAV.t00z /NeoSectional/GFSMAV

Итак он должен удалить файл GFSMAV

Затем загрузить новый файл GFSMAV.t00z и поместить его в каталог NeoSectional

Подождите пять секунд

Затем измените имя с GFSMAV.t00z в GFSMAV

Вот что я получаю в качестве вывода на моих друзей pi.

getmos0.sh: line 2: $'\r': command not found
getmos0.sh: line 3: $'\r': command not found
--2020-04-22 11:50:03--  https://www.weather.gov/source/mdl/MOS/GFSMAV.t18z
Resolving www.weather.gov (www.weather.gov)... 23.1.244.20, 2600:1406:3c:498::116,     2600:1406:3c:497::116
Connecting to www.weather.gov (www.weather.gov)|23.1.244.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3198792 (3.0M) [text/plain]
Saving to: ‘/NeoSectional/\r/GFSMAV.t18z.1’

GFSMAV.t18z.1                     100%   [============================================================>]   3.05M  1.72MB/s    in 1.8s    

2020-04-22 11:50:05 (1.72 MB/s) - ‘/NeoSectional/\r/GFSMAV.t18z.1’ saved [3198792/3198792]

sleep: invalid time interval ‘5\r’
Try 'sleep --help' for more information.
mv: cannot stat '/NeoSectional/GFSMAV.t18z': No such file or directory

По какой-то причине он заканчивается созданием каталога с именем '' $ '\ r'

Также он выдает ошибку при удалении файла, он пытается поместить файл в / NeoSectinoal / \ r /, а затем, поскольку он помещает его в этот нечетный каталог, в конце mv.

У нас есть chmod + x файл bash.

Есть идеи, что здесь происходит?

СПАСИБО

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Проблема заключается в разделении строк.

Windows завершает каждую строку, используя перевод строки (\n) и возврат каретки (\r) (два символа), в то время как linux использует только перевод строки.

Скорее всего, возникла проблема при копировании файла из windows в Raspberry Pi. При этом \r s и bash не могли его понять, когда вы пытались его выполнить.

Вы можете сделать одно из следующих действий:

  • открыть файл на Raspberry Pi с помощью текстового редактора удалите все странные символы в конце строк (особенно такие, как ^M или \n), если они есть, удалите символы новой строки и создайте их снова (в редакторе)

  • Удалите все \r с автоматически с помощью такой команды, как cat getmos0.sh | sed 's/\r$//' > tmp;mv tmp getmos0.sh.

  • Если установлена ​​fromdos, вы можете просто запустить fromdos getmos0.sh , См. Комментарий @ Roadowl.

Вы должны находиться в том же каталоге, что и скрипт, и иметь права на запись для использования этих решений.

0 голосов
/ 22 апреля 2020

Я не знаю, ясно ли вам из приведенных выше комментариев, что ваш файл getmos0.sh содержит \r\n (возврат каретки и перевод строки) в конце каждой строки, как в MS-DOS, вместо \n (перевод строки) только как в Unix и Linux.

Ответы, которые они вам дали, имеют это как цель. Более короткий способ удалить все \r из вашего файла без создания временного файла tmp:

sed -i 's/\r$//' getmos0.sh
...