linux脚本中判断命令是否存在 hash <the_command>

转载 2017年10月07日 01:31:02

POSIX compatible:

command -v <the_command>

For bash specific environments:

hash <the_command> # For regular commands. Or...
type <the_command> # To check built-ins and keywords


Avoid which. Not only is it an external process you’re launching for doing very little (meaning builtins like hash, type or command are way cheaper), you can also rely on the builtins to actually do what you want, while the effects of external commands can easily vary from system to system.

Why care?

  • Many operating systems have a which that doesn’t even set an exit status, meaning the if which foo won’t even work there and will always report that foo exists, even if it doesn’t (note that some POSIX shells appear to do this for hash too).
  • Many operating systems make which do custom and evil stuff like change the output or even hook into the package manager.

So, don’t use which. Instead use one of these:

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

(Minor side-note: some will suggest 2>&- is the same 2>/dev/null but shorter – this is untrue. 2>&- closes FD 2 which causes an error in the program when it tries to write to stderr, which is very different from successfully writing to it and discarding the output (and dangerous!))

If your hash bang is /bin/sh then you should care about what POSIX says. type and hash’s exit codes aren’t terribly well defined by POSIX, and hash is seen to exit successfully when the command doesn’t exist (haven’t seen this with type yet). command’s exit status is well defined by POSIX, so that one is probably the safest to use.

If your script uses bash though, POSIX rules don’t really matter anymore and both type and hash become perfectly safe to use. type now has a -P to search just the PATH and hash has the side-effect that the command’s location will be hashed (for faster lookup next time you use it), which is usually a good thing since you probably check for its existence in order to actually use it.

As a simple example, here’s a function that runs gdate if it exists, otherwise date:

gnudate() {
    if hash gdate 2>/dev/null; then
        gdate "$@"
        date "$@"

(二)NS3如何编译、运行脚本和 Command Line命令行参数设置

二、编译和运行脚本 7. 编译和运行脚本主要步骤 1) 将编写的脚本复制到ns-3.22/scratch目录下(可以在ubuntu窗口界面直接复制) 进入ns3目录: /ns-3.22 $ cp ex...
  • E_pen
  • E_pen
  • 2015年04月28日 16:44
  • 3661

NS3 Command Line Arguments 使用命令行参数改变脚本

转自: 除了通过NS_LOG环境变量外,另一个不用编译就可以改变NS3脚本的方...

Linux Command Line and....ch11(构建基本脚本)

本章内容: 使用多个命令 创建脚本文件 显示消息 使用变量 输入输出重定向 管道 数学运算 退出脚本 11.1 使用多个命令shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令...

Linux Command Line and....ch16(控制脚本)

本章内容: 处理信号 以后台模式运行脚本 禁止挂起 作业控制 修改脚本优先级 脚本执行自动化 16.1 处理信号 16.1.1 重温Linux信号 bash shell会处理收到的1和2信号=...

linux下执行脚本,提示Command not found解决办法

遇上了这个坑,搞了好久没搞定,参考了前辈的文章,终于搞好了,分享如下 原文地址:


  • 2015年01月06日 20:57
  • 1.52MB
  • 下载

Linux Command Line and....ch13(更多的结构化命令——循环)

本章内容: for循环语句 until迭代语句使用while语句 循环 重定向循环的输出 13.1 for命令 for var in list do commands do...

Linux / Unix Command: sed命令

Linux / Unix Command: sed Command Library sed - manual page for sed version ...

Linux Command Line and....ch12(使用结构化命令)

本章内容: if-then 嵌套if test命令 复合条件测试 使用双方括号和双括号 case命令 12.1 if-then语句 if command then commands...

已解决:登录Linux后好多命令不能用,如使用service会报错service command not found

su 或者 su root:的话只是将当前身份转为root,用户shell并没有改变.所以有些系统命令不能使用. su -或者su -l或者su -l root,可以完全的将当前环境转为root环...
您举报文章:linux脚本中判断命令是否存在 hash <the_command>