2016-06-21 13 views
0

먼저 문제를 설명합니다. 나는 종종 내 안드로이드 타블렛에 내 리눅스 바탕 화면에서 파일을 복사합니다. 이유는 내가 들어 가지 않았기 때문에 내가 찾은 가장 쉬운 방법은 내 타블렛에서 sshDroid (ssh 서버)를 실행하고 쉘에서 파일을 복사하는 scp을 사용하는 것입니다. scp 명령의 형식은 다음과 같습니다bash 함수에 매개 변수 이스케이프

scp -P 2222 ./some\ document\:\ with\ subtitle\ -\ author.txt \ 
      [email protected]:/sdcard/uploads 

파일의 이름은이 표현의 변화, 그리고이 아주 쉽게 탭 완성을 통해 달성되는 유일한 것. 심지어는 IP 주소가 변경되지 않습니다. 파일을 자주 업로드하기 때문에 같은 문자를 반복해서 입력하지 않아도됩니다. 이를 위해 쉘 함수를 작성하여 .bashrc에 추가 할 것이라고 생각했습니다. 이 사용이 있어야하는데있어

upload(){ scp -P 2222 [email protected] [email protected]:/sdcard/uploads; } 

:

upload ./some\ document\:\ with\ subtitle\ -\ author.txt 

하지만 난 그것을하려고하면 다음과 같은 출력을 얻을 :

SSHDroid 
Use 'root' as username 
Default password is 'admin' 
[email protected]'s password: 
./some: No such file or directory 
ssh: Could not resolve hostname document: Name or service not known 
with: No such file or directory 
subtitle: No such file or directory 
-: No such file or directory 
author.txt: No such file or directory 

이 모습을 다음과 같이 내가 쓴 기능입니다 bash는 파일 이름을 함수에 전달하기 전에 파일 이름을 자동으로 이스케이프 처리합니다. scp 명령은 이름의 공백으로 인해 여러 파일 이름으로 처리합니다.

내 질문은 : 매개 변수에 백 슬래시를 유지하려면 어떻게해야합니까? 그렇지 않으면 어떻게 함수 내에서 다시 이스케이프합니까? 이 작업을 한동안 수행 한 후 간단한 파이썬 스크립트를 작성하여/usr/local/bin에 넣으려고합니다. 내가 누락 된 다른 bash 네이티브 솔루션이 있습니까?

+0

그것은 "문제를 푸는"것이 아니라 문자열 분할입니다. 언 이스케이프는 파싱 프로세스의 초기에 항상 발생하지만, 그것은 가정 된 기능입니다. 이것은 버그가 아니라 기능입니다. 문제는 이스케이프 처리되지 않은 콘텐츠가 정확하게 따옴표로 묶이지 않아 문자열 분할 또는 glob 확장을 가져 오는 경우입니다. http://mywiki.wooledge.org/BashParser –

+0

BTW, 실행 모델을 잘 이해하는 것이 목표이고 [BashParser 페이지가 아직 자신감이 떨어지는 경우], BashFAQ # 50은 다음과 같은 주제를 다룹니다. 이 질문의 배후에있는 오해의 일부. http://mywiki.wooledge.org/BashFAQ/050 참조 –

답변

2

견적!

따옴표 붙이지 않고 [email protected]$*과 동일하게 동작합니다. 원래의 토큰 화를 유지하려면 대신 "[email protected]"을 사용해야합니다. 따라서 :

upload() { scp -P 2222 "[email protected]" [email protected]:/sdcard/uploads; } 
+0

그것은 작동합니다! 대답과 깊이있는 링크에 감사드립니다. –