0

まず、問題を説明します。Linux デスクトップから Android タブレットにファイルをコピーすることがよくあります。入りたくない理由により、これを行う最も簡単な方法は、タブレットで sshDroid (ssh サーバー) を実行scpし、シェルから を使用してファイルをコピーすることです。scpコマンドの形式は次のとおりです。

scp -P 2222 ./some\ document\:\ with\ subtitle\ -\ author.txt \
            root@197.157.0.211:/sdcard/uploads

この式で変更されるのはファイルの名前だけであり、タブ補完を使用して非常に簡単に取得できます。IPアドレスすら変わらない。ファイルを頻繁にアップロードするので、同じ文字を何度も入力したくありません。この目的のために、シェル関数を作成して に追加すると思いました.bashrc。私が書いた関数は次のとおりです。

upload(){ scp -P 2222 $@ root@192.168.0.151:/sdcard/uploads; }

その使用法は次のようになります。

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

しかし、試してみると、次の出力が得られます。

SSHDroid
Use 'root' as username
Default password is 'admin'
root@192.168.0.151'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ネイティブソリューションはありますか?

4

1 に答える 1

2

引用!

引用符なし、$@と同じように動作し$*ます。元のトークン化を保持したい場合は、"$@"代わりに使用する必要があります。したがって:

upload() { scp -P 2222 "$@" root@192.168.0.151:/sdcard/uploads; }
于 2016-06-21T04:15:16.010 に答える