#!/bin/sh
foo() {
echo "in foo"
}
type foo
checkbashisms.pl
明明不喜欢type
,为什么?
$ checkbashisms.pl foo.sh
possible bashism in foo.sh line 7(type):
type foo
不是POSIX吗?但是所有常见的shell都支持它(即bash
, zsh
, dash
, busybox sh
, mksh
; 即使在ksh
; 也许只是csh
不支持它),难道没有办法抑制这个警告吗?
type
是POSIX 的一部分,但作为 X/Open Systems Interfaces 选项 (XSI) 的一部分。手册checkbashisms
页明确说So
type
被标记,因为它是一个可选功能。checkbashisms
除了从脚本中删除它们之外,我不知道有任何方法可以禁用 中的特定警告。考虑
command -v foo
或command -V foo
代替type foo
。我被告知它更可靠,更有可能是内置的。让我们在
$PATH
可执行文件、内置函数、函数和别名上进行测试:输出(使用破折号0.5.11):
(注意:
sed
不是别名!也许这指的是 dash 的命令位置哈希表?)尝试在 bash 中运行它,你会得到错误
type
,command -V
因为 bash 没有在非交互式脚本中启用别名。Bash 还将揭示整个函数定义——在多行上—— givencommand -V
,这真的很难解析。POSIX将
command
的选项定义为:在编写 shell 脚本时,我强烈建议使用
command -v
而不是type
或command -V
,因为它是三个中唯一具有定义输出的一个。再说一次,我的大多数脚本都是通过一个静默帮助函数调用它,该函数完全忽略它的输出,因为它确定我们是否有命令:该命令
type
绝对不是 abashism
,因为它是UNIX
自 1984 年以来的一部分。但是,如果您在仅提供基本兼容性的微型嵌入式平台上,则该
type
命令可能不存在。POSIX
如果您在自称为
UNIX
-platform 的平台上,则该type
命令是强制性的,因为需要UNIX
-platform 来支持标准中提到的所有所谓的增强功能。XSI
POSIX
如果您正在寻找即使微型嵌入式系统也需要支持的类似命令,您可能喜欢使用:
反而。请注意,大写 -V 选项
command
打印的输出与type
.另请注意:标准中没有定义from
command -V
和 from的输出格式。type
POSIX