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

echo `/usr/sbin/service postfix status`; lists files in folder and appends postfix status

我从 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

我尝试了多种组合。如果我不指定服务,则回显输出是服务命令的用法。如果我指定了一个服务但没有跟在它后面的动词,则会回显该服务的用法(即重新启动|停止|启动|状态)。

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

编辑
我相信前导星号导致文件被列出。

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)。


编写 shell 脚本时,我推荐以下内容:

  • set -x 查看正在执行的内容。在这种情况下,它可能有助于看到星号被扩展。如果这对于生产来说太冗长,可以在一切正常后将其删除。
  • set -e 这样一个阶段失败的命令就不会搞乱后面命令的执行。这个在生产中可能也不错。
  • set -u 如果您 偏执狂 担心 (并且您知道自己在做什么)。
  • http://www.shellcheck.net 偶尔在线,或者作为文本编辑器中的插件。