xen*_*ide 21 shell shell-script posix
我正在尝试编写我所有的sh启动/环境脚本,以尽可能多地使用DRY:“适用于我将其克隆到的每个 *nix”。这意味着确保如果我尝试运行不存在的代码,代码会正常失败。为此,我需要能够测试程序是否存在。我知道如何测试文件是否存在,但我不确定如何测试以查看应用程序是否在路径中可执行。我宁愿使用 $PATH,因为其中一些需要在 arch、ubuntu 和 centos 上工作。有些可能安装在我的 homedir 中,在我没有 root 的系统上,有些可能没有安装,而有些则安装在系统路径中。
Gil*_*il' 22
使用type commandname. 如果commandname有任何可执行文件,则返回 true :别名、函数、内置或外部命令(在 中查找$PATH)。或者,使用command commandnamewhich 返回 true 如果commandname是内置或外部命令(在 中查找$PATH)。
exists () {
type "$1" >/dev/null 2>/dev/null
}
Run Code Online (Sandbox Code Playgroud)
有一些 sh 变体(肯定是 POSIX 之前的;我知道/bin/sh在 OSF1 ?3.x 和早期 NetBSD 版本和一些 20 世纪 Linux 发行版中发现的 Almquist shell 的一些版本)type总是返回 0 或不返回存在。我认为这个千年没有任何系统附带这些。如果您遇到过它们,可以使用以下功能$PATH手动搜索:
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Run Code Online (Sandbox Code Playgroud)
如果您想排除内置函数和函数并在$PATH. 大多数外壳都有一个内置的command -v,尽管它是 POSIX 的一个相对较新的补充(从 POSIX:2004 开始仍然是可选的)。它基本上是一个程序员友好的版本type:它打印 中可执行文件的完整路径、$PATH内置函数或函数的裸名以及别名的别名定义。
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Run Code Online (Sandbox Code Playgroud)
Ksh、bash 和 zsh 还必须type -p仅在$PATH. 请注意,在bash中,type -p foo如果foo是内置函数或函数,则返回状态为0 ;如果要测试 中的可执行文件$PATH,则需要检查输出是否为空。type -p不在 POSIX 中;例如 Debian 的 ash(/bin/sh在 Ubuntu 上)没有它。
| 归档时间: |
|
| 查看次数: |
10938 次 |
| 最近记录: |