为什么用ssh执行命令工作,但将其分配给var不起作用?

时间:2012-01-12 15:45:54

标签: linux bash scripting

以下命令有效:

ssh host ls -1 /home/folder/anotherFolder | wc -l

但是这个不起作用:

ssh host num=`ls -1 /home/folder/anotherFolder | wc -l`

也不是:

ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`

也不是:

ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`

所有这些回归:

ls: cannot access /home/folder/anotherFolder: No such file or directory

因为它在客户端计算机中而不是在远程计算机中查找此文件夹。

编辑: 澄清: 我需要在ssh上下文中使用$ num,而不是在它之外。 整个ssh命令是检查$ num是否大于X,如果是,则在远程计算机上执行另一个命令,所有这些命令都在一个ssh会话中。

EDIT2: 谢谢,我已经在你的帮助下完成了我所需要的。 原始任务是删除远程计算机中最旧的文件夹(如果它具有多于X个已定义的文件夹)。 这对我有用:

ssh host "num=\$(ls -1 \$path | wc -l); if [ \$num -gt $num_of_backups ]; then rm -r $backup/\"\$(ls -t1 $backup | tail -n 1)\"; fi"

尽管如此,我怀疑它不是做我需要的最佳方式。 任何其他方式将非常感激。

2 个答案:

答案 0 :(得分:5)

尝试以下方法:

ssh host "num=\$(ls -1 /home/folder/anotherFolder | wc -l); if [ \$num -gt 3 ]; then echo yes: \$num; fi"

您需要转义$符号,否则它们将在本地主机上展开。

或者,使用单引号,然后您不必转义$

ssh host 'num=$(ls -1 /home/folder/anotherFolder | wc -l); if [ $num -gt 3 ]; then echo yes: $num; fi'

此外,最好使用$(command)格式代替`command`进行命令替换。

答案 1 :(得分:1)

任何未转义的管道和反引号都将在当前主机上进行评估。因此,

ssh host ls -1 /home/folder/anotherFolder | wc -l

表示在其他主机上运行ls -1 /home/folder/anotherFolder并计算主机上的行。“

这些命令都在当前主机上运行lswc,然后将num分配给其他主持人:

ssh host num=`ls -1 /home/folder/anotherFolder | wc -l`
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`

原型修复:

num=$(ssh host "ls -1 /home/folder/anotherFolder" | wc -l)

含义:在另一台主机上运行ls,将所有数据发送到此主机,然后在其上运行wc。将wc的结果存储在num中。 @ dogbane的解决方案更有效,因为它只返回计数,而不是所有ls输出。

但是a better way来计算文件数量是这样的:

num=$(ssh host "find /home/folder/anotherFolder -mindepth 1 -maxdepth 1 -printf x | wc -c")