得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

shell 中检查某个命令是否存在

Linux 环境多了,配置也就多,写脚本的时候遇到的问题也多,尤其是当你需要在脚本中用到一个命令的时候,除了内置命令,在用到新命令的时候还是需要先检查一下这个命令是否存在,推荐的方式有三个:command -v,type,hash,因为它们都是 shell builtin

1
2
3
$ command -v anycommand >/dev/null 2>&1 || { echo >&2 "I require anycommand but it's not installed.  Aborting."; exit 1; }
$ type anycommand >/dev/null 2>&1 || { echo >&2 "I require anycommand but it's not installed. Aborting."; exit 1; }
$ hash anycommand 2>/dev/null || { echo >&2 "I require anycommand but it's not installed. Aborting."; exit 1; }

小贴士:

  1. 什么是 hash?

    linux 系统下会有一个 hash 表,刚开机时会显示 hash 为空,当你执行过一次或多次命令,hash 就会记录下执行过的命令的路径第一次执行命令 shell 解释器默认的会从 PATH 路径下寻找该命令的路径,当你第二次使用该命令时,shell 解释器首先会查看 hash 表,没有该命令会去 PATH 路径下寻找

  2. hash 表的作用是什么?

    hash 提高命令的调用速率

  3. 如果你想兼容 POSIX,请使用 command,如果是 bash,则三者均可

    POSIX 没有很好地定义 type 和 hash 的退出代码,当命令不存在时,hash 可以成功地退出(type 中没有看到这一点)。POSIX 很好地定义了 command 的退出状态,因此使用它可能是最安全的,如果选用 hash,那这条命令将被加入 hash 表

  4. 不要使用 which

    • 很多 linux 发行版上的 which 执行完后可能没有返回码,这就意味着在上面执行完 if which anycommand 不会奏效,即使 anycommand 命令不存在,系统也会报告存在,部分 POSIX 风格的 shell 对 hash 命令也会有类似情况

    • 很多 linux 发行版上的 which 会做一些邪恶的事情,比如改变输出结果甚至会接入到包管理器中

be yourself, everyone else is already taken.