echo`/ usr / sbin / service postfix status`;列出文件夹中的文件并附加后缀状态

时间:2015-02-03 10:42:12

标签: bash ubuntu-14.04

我从bash那里得到了一个奇怪的行为,我无法找到解决方案。

我的2行脚本(在我的用户主文件夹中)

#!/bin/bash  
echo `/usr/sbin/service postfix status`;

生成文件夹中的文件列表,最后添加postfix is running

aptupdate.txt aptUpdate.txt ca checksite.sh cronlist.sh customers defrag_DB.sh downloads firewall_rules.txt groupmembers.sh joomla.int.vhost mail mem_usage.py mysqltuner.pl old_watchdog.sh phpinfo.php processlist.txt test.py tuning-primer.sh watchdog.sh postfix is running

我尝试了很多种组合。如果我没有指定服务,则回显的输出是service命令的用法。如果我指定服务而不是后面的动词,则回显服务的使用(即重新启动|停止|开始|状态)。

当我在终端中运行相同的命令时,我得到* postfix is running

修改
我相信主要的星号会导致文件被列出。

1 个答案:

答案 0 :(得分:0)

该行

echo `/usr/sbin/service postfix status`;

有一些问题。除了不赞成的反引号语法和不必要的分号,除了眼睛之外,其中任何一个都没有伤害,最大的问题是缺少引号。

如果/usr/sbin/service postfix status打印* postfix is running,则该行将“变为”:

echo * postfix is running

然后Bash做了它的事情,并将星号扩展为当前目录中所有文件的名称(如果存在)。

快速解决方法是添加一些引号:

echo "`/usr/sbin/service postfix status`";

或者在更清理的版本中:

echo "$(/usr/sbin/service postfix status)"

然而,这意味着执行一件事,将其打印到STDOUT并将其交给echo,以便echo可以将其打印到STDOUT。换一种说法; echo并未提供任何内容。一旦拿出来,我们就会离开:

/usr/sbin/service postfix status

即。不需要$(),因为我们只想运行一个命令,而且不需要引号,因为命令的结果不会用于任何事情(它们会直接转到STDOUT)。 / p>


编写shell脚本时,我建议如下:

  • set -x查看正在执行的内容。在这种情况下,它可能有助于看到星号被扩展。如果这对于生产而言过于冗长,一旦一切正常,就可以将其删除。
  • set -e以便在一个阶段失败的命令不会搞砸以后命令的执行。这也可能对生产有好处。
  • set -u如果您偏执 关注(并且您知道自己在做什么)。
  • http://www.shellcheck.net无论是现在还是在线,或者作为文本编辑器中的插件。