나는 다음 bash 함수를 작성했습니다.
function to_company()
{
scp ${1} [email protected]://home/username
}
내가 할 때 :
$ to_company code_diff.txt
비밀번호를 요청한 후 다음 메시지와 함께 실패합니다.
scp: //home/username: not a regular file
스크립트에 &를 제공하려고 시도했지만 //home/username/
동일한 결과를 얻었습니다.//home/username/${1}
위 명령을 수동으로 실행하고 code_diff.txt
대신 전달하면 ${1}
파일 전송에 문제가 없습니다.
내가 무슨 실수를 했나요?
답변1
중요하지 않지만 원격 경로는 /home/username
(슬래시 하나)여야 합니다. Sputnick 이 지적했듯이 ${1}
."${1}"
동일한 명령을 복사했는데 테스트할 때 제대로 작동했기 때문에 ("일반 파일이 아님" 오류가 발생하는 경우) [email protected]:
와 //home/username
.
시도해 볼 또 다른 방법은 디버깅을 추가하고( -v
scp 명령에 제공하여) 단서가 있는지 확인하는 것입니다.
function to_company()
{
scp -v "${1}" [email protected]:/home/username
}
답변2
이 문제에 잘못된 방식으로 접근하고 있습니다. 쉘 래퍼를 작성하지 말고 대신 ~/.ssh/config
.
Host work
Hostname long.server.name.company.com
User bob
그런 다음 파일을 회사 서버에 복사하려면 다음을 수행하세요.
scp filename.ext work:
원격 경로는 홈 디렉터리에 상대적 work:
이므로 work:/home/username
.
전달하는 인수에 공백이나 와일드카드가 포함되어 있으면 함수가 실패합니다 \[?*
. 이 문제는 매개변수 확장을 큰따옴표로 묶어서 쉽게 해결할 수 있습니다 "$1"
.변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오..
또 다른 잠재적인 문제는 //
경로의 시작이 특별히 해석될 수 있다는 것입니다. 일반적으로 경로의 연속 슬래시는 하나의 슬래시와 동일하지만두 개의 슬래시로 시작하는 경로는 일부 시스템에서 특별한 의미를 갖습니다..