scp의 Bash 스크립트가 물결표(~)를 너무 빨리 해석합니다.

scp의 Bash 스크립트가 물결표(~)를 너무 빨리 해석합니다.

그래서 저는 Linux 환경에서 프로그래밍해야 하는 새로운 C++ 과정을 시작했습니다. 내 컴퓨터에 Linux가 설치되어 있지 않지만 OS가 내 컴퓨터에서 작동하지 않습니다.) 이 질문이 끝날 때까지 알 수 없다면 저는 Linux에 익숙하지 않은 것입니다.

저는 로컬 컴퓨터에 다운로드한 파일을 원격 컴퓨터에 놓고 편집하여 프로그램을 만든 다음 다시 로컬 컴퓨터에 넣어서 보관용 계정에 업로드해야 하는 경우가 많습니다. 입력하는 데 지쳐서 이 작업을 수행하기 위한 별칭을 만들기로 결정했습니다. 그때 나는 별칭이 이런 종류의 일을 처리할 수 없다는 것을 깨달았고 대신 쉘 스크립트를 작성하기로 결정했습니다. 이것이 내가 얻는 것입니다:
scp -P xx [email protected]:~/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 [email protected]:"$location" "$name"

이론적으로는 이것을 입력하기만 get ~/path/to/filename하면 원격 호스트에서 파일을 가져와서 (동일한 파일 이름으로) 내 로컬 컴퓨터의 현재 디렉터리에 복사할 수 있습니다.

이 scp 명령은 명령줄에서 실행하면 잘 작동합니다. 쉘 스크립트에 붙여넣으면 충돌이 발생합니다. 오류가 발생합니다.No such file or directory

많은 테스트(위의 디버그 출력에 주석 처리된 일부를 볼 수 있음)와 연구 끝에 쉘이 확장되고 있음을 발견했습니다.~ 앞으로그것은 그것을 스크립트로 보냅니다(음, 그것은 제가 glob에 대해 알고 있는 것에 기초한 제 추측입니다). 그런 다음 내 스크립트는 내 경로에서 파일을 찾습니다.현지의대신 기기의 홈 폴더외딴머신의 홈 폴더. 어떻게 하면 이 일을 멈추게 할 수 있나요?

이 질문을 입력하면서 명령을 실행할 때 약간의 따옴표가 필요할 수도 있다는 것을 깨달았습니다. 하지만 실제로는 그렇게 하고 싶지 않습니다. 타이핑을 하지 않고도 이 문제를 어떻게든 해결할 수 있습니다. get "~/filename"왜냐하면 이러한 따옴표를 타이핑해야 한다는 것이 정말 짜증나는 일이기 때문입니다.

관련없는 정보가 많으면 죄송하지만, 너무 적은 것보다는 너무 많은 것이 낫다고 생각합니다. 감사해요!

추신: 찾았습니다이것SSH 구성 정보. 유용하기는 하지만 정확한 파일 이름을 두 번 입력해야 하므로 원하는 만큼 게으르지는 않습니다.

답변1

기본적으로 원격 경로는 홈 디렉터리를 기준으로 해석되므로 scp이 작업을 전혀 수행할 필요가 없습니다.~

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

some/file/name홈 디렉터리에서 다운로드되어 로컬에 user저장됩니다 filename. 원격 서버에서 절대 파일 경로를 사용하려면 /: 으로 시작하십시오 scp host:/etc/passwd passwd.

엄밀히 말하면 서버는 상황을 다르게 해석할 수 있습니다. 이 경우 ~매번 명령줄에서 반복하는 대신 스크립트에 넣을 수 있습니다(원하는 경우 게으르게 사용하세요!).

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

이렇게 하면 쉘이 이를 해석할 기회를 얻지 못합니다. (인용할 수도 있습니다 : 또는 ~명령줄에서 , 하지만 이는 필요한 것보다 더 많은 작업입니다.) 하지만 위의 첫 번째 접근 방식이 작동할 것이라고 생각합니다.\~'~'


변수에 대한 또 다른 참고 사항입니다 name. 기본 파일 이름으로 사용하고 싶다고 말씀하셨습니다. 이 목적을 위해 특별히 명령이 있습니다.basename주문하다:

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

이는 모든 것을 실행하는 것보다 간단합니다 sed.

관련 정보