2016-06-21 17 views
0

まず、問題について説明します。私はしばしば自分のlinuxデスクトップからアンドロイドタブレットにファイルをコピーします。理由がないので、私がこれを行うために見つけた最も簡単な方法は、タブレットで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コマンドは名前のスペースのためにファイル名を複数のファイル名として扱います。

私の質問は、パラメータ内のバックスラッシュをどうやって保持するのですか?または、関数内でそれをどのように再解析するのですか?これをしばらく試してみたら、単純なPythonスクリプトを書いて/ usr/local/binに落としたくなってしまいます。私が紛失している他のbash-nativeソリューションがありますか?

+0

これは問題の「エスケープ解除」ではなく、文字列分割です。エスケープ処理は、解析処理の早い段階で常に行われますが、これは機能でありバグではありません。問題は、エスケープされていないコンテンツが正しく引用符で囲まれていないため、文字列分割またはグロブ展開されたときです。 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

それは動作します!答えと詳細なリンクをありがとう。 –

関連する問題