3

У меня есть файл .sh , содержащий команду, которая копирует файл с удаленного сервера в определенный каталог, сохраняя оригинальное имя файла, а вторая строка - просто комментарий:

scp (host):~/filename.sql ~/
# just a comment

Я называю скрипт dbcopy.sh , помещаю его в мой домашний каталог и запускаю из консоли, например:

sh ~/dbcopy.sh

Проблема в том, что из-за разрыва строки после команды scp копируемый файл имеет имя, состоящее из одного символа (в списке ниже он отображается в виде знака вопроса) вместо исходного имени!

console> ls -l ~
...
-rw-rw-r--  1 (user)  (group)   158327960 26 oct 17:28 ?

Если я удаляю разрывы строк после команды scp все работает как положено.

Как мне справиться с этой ситуацией?

2 ответа2

2

Проблема заключалась в том, что в моем редакторе был разделитель конца строки: он использовал последовательность \r\n вместо \n . Таким образом, последний аргумент команды scp был не просто ~/ как он отображает. Это было на самом деле ~/\r .

Таким образом, вместо передачи имени каталога с косой чертой (что указывало бы команде скопировать файл в этот каталог с сохранением имени файла - поведение, которое я ожидал), после косой черты был добавлен еще ряд - символ \r , который привел к тому, что команда приняла его как новое имя для копируемого файла.

0

Вы не включили скрипт или информацию о том, как вы его запускаете. Я не знаю, звоните ли вы от cronjob или от другого пользователя.

Тем не менее, следующий очень простой тестовый скрипт (t.sh) отлично работает для меня на FreeBSD.

#!/bin/sh
echo "Pre test"
scp spider.goo:~/tColor.c ~/
echo "Post test"

Звоните так:

sh ./t.sh

Со следующим выводом:

Pre test
Password for tigger@spider:
tColor.c       100% 1805     1.8KB/s   00:00    
Post test

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .