Сценарий Bash для scp-интерпретации тильды (~) слишком рано

Итак, я только что начал новый класс C ++, который требует от меня программы в среде Linux. У меня нет Linux, установленного на моей машине, но у меня есть OS X, и я могу ssh в Linux-машину в лаборатории в школе (и это предпочтительнее, так как мой код должен компилироваться и запускаться на лабораторном компьютере независимо от того, не работает на моей машине). Если вы не можете сказать к концу этого вопроса, я не очень хорошо знаком с Linux.

Мне часто приходится брать файлы, которые я загружаю на свой локальный компьютер, и выставлять их на удаленную машину, редактировать их, чтобы сделать программу, а затем вернуть их на локальный компьютер, чтобы загрузить их в наш Dropbox. Я устал печатать
scp -P xx user@remote.host.com:~/filename filename
и решил сделать псевдоним, чтобы сделать это. Вот когда я обнаружил, что псевдонимы не обрабатывают подобные вещи, поэтому я решил написать сценарий оболочки. Вот что у меня есть:

 #!/bin/bash # Author: me # Created 26 August 2014 # transfers a file from remote machine to current directory in local machine # keeps same filename location="$1" # name gets just the part of the path after the last slash # ie the filename name="$(echo "$1" | sed -n -e 's/^.*\///p')" # echo "$location" # echo "$name" scp -P xx user@remote.host.com:"$location" "$name" 

Теоретически, я могу просто набрать get ~/path/to/filename и получить файл с удаленного хоста и скопировать его (с тем же именем) в текущий каталог на локальном компьютере.

Эта команда scp, если она запускается из командной строки, отлично работает. Когда я вставляю его в скрипт оболочки, он ломается. Это дает мне ошибку: No such file or directory

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

Я понял, набрав этот вопрос, что мне, вероятно, просто нужны кавычки, когда я запускаю команду … но я действительно не хочу этого делать. Могу ли я исправить это так или иначе, не набрав типа get "~/filename" потому что набирать эти кавычки очень раздражает.

Извините, если есть много посторонней информации, но я полагал, что слишком много лучше, чем слишком мало. Благодаря!

PS: Я уже нашел это о настройке ssh. Хотя полезно, мне все равно придется вводить точное имя файла дважды, что не позволяет мне быть ленивым, каким я хочу быть.

По умолчанию удаленные пути scp интерпретируются относительно домашнего каталога, поэтому вам совсем не нужно:

 scp user@remote.host.com:some/file/name filename 

загрузит some/file/name из домашнего каталога user и сохранит его как filename локально. Если вы хотите использовать абсолютный путь к файлу на удаленном сервере, запустите его с помощью / : scp host:/etc/passwd passwd .

Строго говоря, возможно, что ваш сервер интерпретирует вещи по-разному. В этом случае вы можете вставлять ~ в свой скрипт, а не повторять его в командной строке каждый раз (быть ленивым, как вы хотите!):

 scp user@remote.host.com:~/"$location" "$name" 

Таким образом, у вашей оболочки никогда не будет возможности ее интерпретировать. (Также можно указать ~ в командной строке: \~ или '~' , но это больше, чем необходимо.) Я полагаю, что первый подход выше будет работать.


Еще одно примечание об переменной name . Вы говорите, что хотите, чтобы это было просто базовое имя файла. Для этой цели есть команда, команда basename :

 name="$(basename "$location")" 

Это проще, чем запустить все через sed .