ssh -f $user@$machine_name "cd $path; shard_path=`find . -name "shard0"`; cd $shard_path; mkdir temp"
目录结构为 $path/node0/shard0
在此脚本中,var shard_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") );
这会将 find 的输出放入数组中,然后您可以使用例如
cd ${shard_path_array[0]}
(在远程计算机上)
在通过 SSH 将命令发送到目标计算机之前,$path正在本地扩展。同上$shard路径。如果您希望远程解释/扩展这些值,则需要转义 $,例如 \$path。
这是关于这个主题的非常彻底的处理。