Script bash para interpretação de scp til (~) muito cedo

4

Então, eu acabei de começar uma nova classe C ++ que requer que eu programe em um ambiente Linux. Eu não tenho Linux instalado na minha máquina, mas eu tenho OS X e posso ssh em uma máquina linux no laboratório da escola (e isso é preferível, pois meu código deve ser compilado e executado na máquina do laboratório, independentemente de não funciona na minha máquina). Se você não souber ao final desta pergunta, não estou muito familiarizado com o Linux.

Frequentemente precisarei pegar os arquivos que eu baixei na minha máquina local e colocá-los na máquina remota, editá-los para criar o programa e colocá-los de volta na minha máquina local para carregá-los em nossa caixa de depósito. Cansei-me de digitar scp -P xx [email protected]:~/filename filename
e decidiu criar um alias para fazer isso. Foi quando descobri que aliases não lidam com esse tipo de coisa, então decidi escrever um script de shell. Aqui está o que eu tenho:

#!/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 [email protected]:"$location" "$name"

Teoricamente, eu posso apenas digitar get ~/path/to/filename e ele irá pegar o arquivo do host remoto e copiá-lo (com o mesmo nome de arquivo) para o diretório atual na máquina local.

Esse comando scp, se executado a partir da linha de comando, funciona muito bem. Quando eu coloco em um shell script, ele quebra. Isso me dá o erro: No such file or directory

Depois de muitos testes (você pode ver alguns resultados de depuração com comentários lá em cima) e pesquisando, descobri que o shell está expandindo ~ antes para o script (bem, Este é o meu palpite com base no que eu descobri sobre globs). Meu script está procurando o arquivo no caminho da pasta pessoal da minha máquina local em vez da pasta base da máquina remota . Como faço para parar de fazer isso?

Eu percebi, ao digitar essa pergunta, que provavelmente só preciso de algumas citações quando executo o comando ... mas realmente não quero fazer isso. Posso corrigir isso de alguma forma sem ter que digitar get "~/filename" porque ter que digitar essas aspas é realmente irritante.

Desculpe se há muitas informações externas, mas imaginei que muito é melhor do que muito pouco. Obrigado!

PS: Eu já encontrei este sobre como configurar o ssh . Embora útil, eu ainda teria que digitar o nome do arquivo exato duas vezes, o que não me permite ser tão preguiçoso quanto eu quero ser.

    
por Maribeth 27.08.2014 / 07:45

1 resposta

5

Por padrão, scp caminhos remotos são interpretados em relação ao diretório base, assim você não precisa do ~ :

scp [email protected]:some/file/name filename

baixará some/file/name do diretório pessoal de user e o salvará como filename localmente. Quando você quiser usar um caminho de arquivo absoluto no servidor remoto, inicie-o com / : scp host:/etc/passwd passwd .

Estritamente, é possível que o seu servidor esteja interpretando as coisas de maneira diferente. Nesse caso, você poderia colocar ~ em seu script, em vez de repeti-lo na linha de comando toda vez (seja o mais preguiçoso que você quiser!):

scp [email protected]:~/"$location" "$name"

Dessa forma, seu shell nunca terá a chance de interpretá-lo. (Também é possível citar o ~ na linha de comando: \~ ou '~' , mas isso é mais trabalho do que o necessário.) No entanto, imagino que a primeira abordagem acima funcionará.

Outra observação sobre a variável name . Você diz que quer que seja apenas o nome do arquivo base. Existe um comando com esse objetivo exato, o comando basename :

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

Isso é mais simples do que executar tudo em sed .

    
por 27.08.2014 / 07:56