0
ssh -f $user@$machine_name "cd $path; shard_path=`find . -name \"shard0\"`; cd $shard_path; mkdir temp"

ディレクトリ構造は $path/node0/shard0 です

このスクリプトでは、varshard_pathが null です。なぜですか? また、ディレクトリはではなく でtemp構築されます。~/shard0

4

3 に答える 3

2

サーバーに送信するコマンドを二重引用符で囲んでいるため、ローカルで展開されています。$pathローカル値に$shard_path基づいて置換しようとしていますが、ローカル$shard_pathで定義されていないため、何も展開されません。

サーバー上で実行されるコマンドに一重引用符を使用することで、これらの引用の問題の多くを回避できます。必要な正確な引用符は、これらの変数が定義されている正確な場所によって異なります。しかし、あなたのコメントから、これが必要なコマンドのように思えます:

ssh -f $user@$machine_name "cd $path;"'shard_path=$(find . -name "shard0"); cd $shard_path; mkdir temp'
于 2012-12-05T06:59:53.023 に答える
1

Brian Campbell との議論から、$path変数はローカル クライアント$shard_path上にあり、リモート ロケーション上にあると思います。

次に、次のことを試してください。

ssh -f xce@ns20.xce.n.xiaonei.com "echo $path; cd $path; shard_path=\$(find . -name \"shard0\"); echo \$shard_path;"

注:「shard0」というファイルが複数存在する可能性がある場合、find は多くのパスを出力するので、
shard_path_array=( \$(find . -name \"shard0\") );
これを使用するとよいでしょう
cd \${shard_path_array[0]}。リモートマシン)

于 2012-12-05T10:50:15.620 に答える
0

$path は、コマンドが ssh 経由で宛先マシンに送信される前に、ローカルで展開されています。$shard_path と同じです。これらの値をリモートで解釈/展開したい場合は、$ をエスケープする必要があります (例: \$path)。

これは、このテーマに関する非常に徹底的な治療法です。

于 2012-12-05T06:57:13.887 に答える