Bash Shell使用或替换内建命令与外部命令

Bash Shell使用或替换内建命令与外部命令,你想用自己编写的函数或外部命令替换内建命令,还想知道脚本究竟执行的是哪种命令(例如,是/bin/echo 还是内建的 echo)。又或者你创建了一个新命令,但可能和已有的外部或内建命令冲突。

解决方案

用 type 和 which 命令查看指定命令是否存在,并确定其是内建命令还是外部命令:

$ type cd
cd is a shell builtin

$ type awk
awk is /usr/bin/awk

$ which cd
/usr/bin/which: no cd in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/ \
local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin)

$ which awk
/usr/bin/awk

讨论

顾名思义,内建命令就是内建在 shell 自身中的命令,外部命令则是由 shell 运行的外部文件。外部文件可以是二进制文件,也可以是 shell 脚本。理解内外部命令之间的差异很重要。首先,当你使用特定 shell 的某个版本时,内建命令总是可用的,但外部程序就未必已经安装在系统中了。其次,如果你自己的某个程序和内建命令同名,结果会让人很困惑,因为内建命令总是会优先执行。可以用 enable 命令来关闭或启用内建命令,不过强烈建议不要这么做,除非你有十足把握知道自己在做什么。enable -a 可以列出所有的内建命令及其当前状态(启用或禁用)。

内建命令的问题在于你无法使用 -h 或 –help 选项获得使用帮助,即便有手册页,通常也只是简单地指向 bash 手册页而已。这时候就用得上内建命令 help 了。help 会显示 shell 内建命令的帮助信息。

help: help [-dms] [pattern ...]
    Display information about builtin commands.

    Displays brief summaries of builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise the list of help topics is printed.

    Options:
      -d        output short description for each topic
      -m        display usage in pseudo-manpage format
      -s        output only a short usage synopsis for each topic matching
     PATTERN

    Arguments:
      PATTERN   Pattern specifying a help topic

    Exit Status:
    Returns success unless PATTERN is not found or an invalid option is given.

需要重新定义某个内建命令时,可以用 builtin 命令来避免出现循环现象。例如,我们可以定义一个 shell 函数来改变 cd 命令的工作方式。

cd () {
    builtin cd "$@"
    echo "$OLDPWD --> $PWD"
}

要想避开优先级更高的函数或内建命令,而强制使用外部命令,可以利用 enable -n 关闭 shell 内建命令或用 command 忽略 shell 函数。例如,输入 enable -n test,然后执行 test,此时运行的就不再是内建命令,而是 $PATH 中的 test。也可以用 command ls 来执行原生的 ls 命令,而非可能存在的自定义 ls 函数。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!