私はLinuxの経験はありませんが、毎日学んでいます。
私にはこのコマンドがあります。
ssh admin@$host mv repo/environments/qa/* /repo
この*
文字は、environments/qa
ディレクトリ内のすべてのエントリがその/repo
ディレクトリに保存されることを意味しますか?すでに存在している場合は置き換えられますか?
申し訳ありません。私はシェルコマンドの経験がありません。ただ確認したかったです。
答え1
他の言語に翻訳された:
ssh admin@$host mv repo/environments/qa/* /repo
シェルコマンド(shやbashなどのPOSIXシェルを想定)は次のとおりです。
execute("ssh", glob(split("admin@" + $host)), "mv", glob("repo/environments/qa/*"), "/repo");
(文字に基づいて分割します$IFS
が、拡張部分のみに基づいています。isや包含$host
と同様に、およびに分割され、リテラルの合計は分割されません。)$host
machine
$IFS
an
admin@machine
admin@m
chi
e
a
n
admin
あなたはそれをしたいが:
execute("ssh", "admin@" + $host, "mv repo/environments/qa/* /repo")
シェルの構文は次のとおりです。
ssh admin@"$host" 'mv repo/environments/qa/* /repo'
ssh
文字列はリモートサーバーmv repo/environment/qa/* /repo
に渡されるため、sshd
解釈のためにリモートユーザーのログインシェルに渡すことができます。通常は次のようになります。
execute("that-shell", "-c", "mv repo/environments/qa/* /repo")
ほとんどのシェルでは、これは次のようになります。
execute("mv", glob("repo/environments/qa/*"), "/repo")
mv
隠されていないすべてのファイル(次を含むすべての種類)を移動するように指示します。目次)(それ自体は、ユーザーのホームディレクトリに初期化する必要があるrepo/environments/qa
シェルプロセスの現在の作業ディレクトリへの相対パス)を1に設定します。sshd
/repo
これからいくつかの結論を導き出すことができます。
上記のパラメータ拡張は、
$host
分割+グローブを防ぐためにほとんど常に引用する必要があります。リモートシステムのシェルがglobを拡張したいので、
*
文字通り渡す必要があります。ssh
シェルコードをリモートで解釈すると、単純なコマンドが実行されないことを覚えておくことが重要です。複数の引数を渡す場合は、スペースで接続してリモートシェルに渡すコードを形成しますが、単純なコマンドではなくシェルコードであることを覚えておくには、コード引数だけを渡すことをお勧めします。そして、リモートシェル構文のすべての特殊文字はこのように扱われます。ssh host echo *.txt
たとえば、これは*.txt
ローカルシェルによって拡張されて完了するfoo;reboot #.txt
ため、実行しないでください。呼び出されている現在の作業ディレクトリにファイルがある場合は、実行して再起動してください。execute("ssh", "host", "echo", "foo;reboot #.txt")
sshd
execute("sh", "-c", "echo foo;reboot #.txt")
/repo
¹ 存在するかタイプでない場合に注意してください。目次(またはディレクトリへのシンボリックリンク)単一repo/environments/qa/*
のファイルに展開します。名前変更、移動する(大引っ越す)/repo
;/repo
問題を回避し、ディレクトリ/repo/
でない場合はエラーを報告するように変更されました。/repo