
私は次の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
(スラッシュ1つ)でなければなりません。 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"
。変数とコマンドの置換には常に二重引用符を使用してください。。
別の潜在的な問題は、//
パスの始まりが特に解釈される可能性があることです。通常、パスの連続スラッシュは1つのスラッシュと同じですが、2つのスラッシュで始まるパスは、いくつかのシステムで特別な意味を持ちます。。