情况如下:
我正在编写一个 SH 部署脚本,它将在 CYGWIN 中使用 RSYNC 命令部署一个网站。安装完成后,我想给开发团队发一封电子邮件,说已经进行了部署,并提供了一些细节。我将使用“exim”从 CYGWIN 发送邮件。
问题是,exim 仅在安装 CYGWIN 时是可选的,如果未安装,我想退出我的 SH 脚本。如果在脚本中安装了应用程序,是否有任何想法检查 UNIX(并在 CYGWIN 中工作)?
提前致谢 !
# bash script (should also work with sh)
# someprog must be on the path for type to find it
if type -p "someprog"
then
echo "it's there"
else
echo "it isn't"
fi
专门检查“exim”,执行
exim -bV
在我的 Cygwin 上,它会给出如下输出,
Exim version 4.69 #1 built 28-Jan-2008 21:59:08
Copyright (c) University of Cambridge 2006
Probably GDBM (native mode)
Support for: crypteq iconv() PAM OpenSSL Content_Scanning
Lookups: lsearch wildlsearch nwildlsearch iplsearch dbm dbmnz dnsdb dsearch ldap
ldapdn ldapm passwd
Authenticators: cram_md5 plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply pipe smtp
Size of off_t: 8
Configuration file is /etc/exim.conf
来自' exim -bV '的'exim'手册,
此选项使 Exim 将 exim 二进制文件的当前版本号、编译号和编译日期写入标准输出。它还列出了正在使用的 DBM 库、可选模块(例如特定查找类型)、二进制文件中包含的驱动程序以及正在使用的运行时配置文件的名称。
作为其操作的一部分,-bV 使 Exim 读取并检查其配置文件的语法。但是,这只是静态检查。它不能检查要扩展的值。例如,虽然检测到拼写错误的 ACL 动词,但不会检测到动词参数中的错误。您不能仅依靠 -bV 来发现(例如)配置中的所有拼写错误;需要进行一些实际的测试。-bh 和 -N 选项提供更多动态测试工具。
与type
和which
检查进行比较。
type是一个 shell 内置命令。它指示名称在用作命令时如何被 shell 解释。该-p
选项使其返回在发出命令时将执行的磁盘文件的名称。
它PATH
只是使用相同的bash
算法在搜索中按给定名称搜索可执行文件。
如果有人将同名的可执行文件放在路径中,则其中任何一个都将返回 true。如果安全是一个问题,您应该更加小心地从脚本调用命令。
知道你正在运行什么可能是谨慎的。
当然,我也可以实现一个名为的 shell 脚本,它会在;exim
上返回上述输入。-bV
和背景中的混乱事情——你的偏执程度是多少?
您可以使用“哪个”命令。如果不存在,它将返回程序的位置或不返回任何内容。
为了减轻nik提出的安全问题,您可以根据预期的位置列表检查可执行文件的位置:
case $(type -p someprog) in
/usr/bin/someprog \
| /bin/someprog \
| /usr/local/someprog)
echo "Valid location";;
*)
echo "Invalid location";;
esac