Bash 如何以编程方式验证是否在SH脚本中安装了CYGWIN应用程序?

Bash 如何以编程方式验证是否在SH脚本中安装了CYGWIN应用程序?,bash,unix,scripting,cygwin,exim,Bash,Unix,Scripting,Cygwin,Exim,情况如下: 我正在编写一个SH部署脚本,该脚本将使用CYGWIN中的RSYNC命令部署一个网站。安装完成后,我想向开发团队发送一封电子邮件,告知已经进行了部署,并提供了一些详细信息。我将使用“exim”从CYGWIN发送邮件 问题是,在安装CYGWIN时,exim只是可选的,如果没有安装,我想退出我的SH脚本。如果在脚本中安装了应用程序,是否可以在UNIX中进行检查(并在CYGWIN中工作) 提前谢谢 您可以使用“which”命令。 # bash script (should also work

情况如下:

我正在编写一个SH部署脚本,该脚本将使用CYGWIN中的RSYNC命令部署一个网站。安装完成后,我想向开发团队发送一封电子邮件,告知已经进行了部署,并提供了一些详细信息。我将使用“exim”从CYGWIN发送邮件

问题是,在安装CYGWIN时,exim只是可选的,如果没有安装,我想退出我的SH脚本。如果在脚本中安装了应用程序,是否可以在UNIX中进行检查(并在CYGWIN中工作)


提前谢谢

您可以使用“which”命令。
# 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

它将返回程序的位置,如果不存在,则不返回任何内容。

您可以使用“which”命令。
它将返回程序的位置,如果不存在,则不返回任何内容。

特别是要检查“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
从“进出口银行-bV”上的“进出口银行”手册中

此选项导致Exim写入当前版本号,即编译 将exim二进制文件的编号和编译日期转换为标准输出。 它还列出了正在使用的DBM库、可选模块 (例如特定的查找类型),包含在 二进制文件,以及正在使用的运行时配置文件的名称

作为其操作的一部分,-bV使Exim读取并检查其语法 配置文件。但是,这只是一个静态检查。它无法检查 要展开的值。例如,尽管ACL动词拼写错误 如果检测到,则谓词参数中的错误不会被忽略。你不能依靠 -bV独自发现(例如)配置中的所有打字错误; 需要一些现实的测试。-bh和-N选项提供了更多 动态测试设施


与检查的
类型
相比较

type是一个shell内置命令。它指示如果将名称用作命令,shell将如何解释该名称。
-p
选项使其返回在发出命令时将执行的磁盘文件的名称

使用相同的
bash
算法,在搜索
PATH
中按给定名称搜索可执行文件

如果有人将同名的可执行文件放在路径中,则这两个选项中的任何一个都将返回true。如果出于安全考虑,在从脚本调用命令时应该更加小心。

了解您正在运行的内容可能是明智的。

当然,我还可以实现一个名为
exim
的shell脚本,它将在
-bV
上返回上述输入;把事情搞得一团糟——你的偏执程度如何?

特别是为了检查“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
从“进出口银行-bV”上的“进出口银行”手册中

此选项导致Exim写入当前版本号,即编译 将exim二进制文件的编号和编译日期转换为标准输出。 它还列出了正在使用的DBM库、可选模块 (例如特定的查找类型),包含在 二进制文件,以及正在使用的运行时配置文件的名称

作为其操作的一部分,-bV使Exim读取并检查其语法 配置文件。但是,这只是一个静态检查。它无法检查 要展开的值。例如,尽管ACL动词拼写错误 如果检测到,则谓词参数中的错误不会被忽略。你不能依靠 -bV独自发现(例如)配置中的所有打字错误; 需要一些现实的测试。-bh和-N选项提供了更多 动态测试设施


与检查的
类型
相比较

type是一个shell内置命令。它指示如果将名称用作命令,shell将如何解释该名称。
-p
选项使其返回在发出命令时将执行的磁盘文件的名称

使用相同的
bash
算法,在搜索
PATH
中按给定名称搜索可执行文件

如果有人将同名的可执行文件放在路径中,则这两个选项中的任何一个都将返回true。如果出于安全考虑,在从脚本调用命令时应该更加小心。

了解您正在运行的内容可能是明智的。

当然,我还可以实现一个名为
exim
的shell脚本,它将在
-bV
上返回上述输入;然后在后台把事情搞得一团糟--你的偏执程度如何?

为了缓解nik提出的安全问题,你可以对照预期的位置列表检查可执行文件的位置:

case $(type -p someprog) in

    /usr/bin/someprog \
    | /bin/someprog \
    | /usr/local/someprog)

        echo "Valid location";; 
    *)
        echo "Invalid location";;
esac

为了减轻nik带来的安全问题,您可以对照预期的位置列表检查可执行文件的位置:

case $(type -p someprog) in

    /usr/bin/someprog \
    | /bin/someprog \
    | /usr/local/someprog)

        echo "Valid location";; 
    *)
        echo "Invalid location";;
esac

谢谢,最后看起来很容易,但不知道命令:)谢谢,最后看起来很容易,但不知道命令:)