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
サーバーに送信するコマンドを二重引用符で囲んでいるため、ローカルで展開されています。$path
ローカル値に$shard_path
基づいて置換しようとしていますが、ローカル$shard_path
で定義されていないため、何も展開されません。
サーバー上で実行されるコマンドに一重引用符を使用することで、これらの引用の問題の多くを回避できます。必要な正確な引用符は、これらの変数が定義されている正確な場所によって異なります。しかし、あなたのコメントから、これが必要なコマンドのように思えます:
ssh -f $user@$machine_name "cd $path;"'shard_path=$(find . -name "shard0"); cd $shard_path; mkdir temp'
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]}
。リモートマシン)
$path は、コマンドが ssh 経由で宛先マシンに送信される前に、ローカルで展開されています。$shard_path と同じです。これらの値をリモートで解釈/展開したい場合は、$ をエスケープする必要があります (例: \$path)。