まず、問題について説明します。私はしばしば自分の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ソリューションがありますか?
これは問題の「エスケープ解除」ではなく、文字列分割です。エスケープ処理は、解析処理の早い段階で常に行われますが、これは機能でありバグではありません。問題は、エスケープされていないコンテンツが正しく引用符で囲まれていないため、文字列分割またはグロブ展開されたときです。 http://mywiki.wooledge.org/BashParser –
BTWを参照してください。実行モデルをよく理解することが目的であれば[BashParserページはまだ自信を失ってしまいます]、BashFAQ#50はこの質問の背後にある誤解の根底にあるもの。 http://mywiki.wooledge.org/BashFAQ/050を参照してください –