我从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
。
修改
我相信主要的星号会导致文件被列出。
答案 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
如果您