我知道该命令command
是在最新的 POSIX 标准中指定的,而builtin
不是。我也意识到这两个命令都是常规的内置命令(即它们可以被用户定义的函数覆盖)。一些外壳定义了builtin
,但不是全部(例如dash
没有)。我想了解为什么builtin
在某些 shell 中引入。
据我所知,builtin
只会返回特殊的然后是常规的内置函数,但是command
会返回特殊的内置函数,然后是常规的内置-p
函数,然后是路径上的命令(并且可以使用开关command
来指定它使用外壳定义的默认值$PATH
,以防用户修改$PATH
)。
例如,在 中mksh
,我看到以下内容:
(注意: mksh
从 repo 安装在 Ubuntu 20.04 上http://archive.ubuntu.com/ubuntu focal/universe amd64 mksh amd64 58-1
)
$ echo $KSH_VERSION
@(#)MIRBSD KSH R58 2020/03/27
$ which -a echo
/usr/bin/echo
/bin/echo
$ which -a printf
/usr/bin/printf
/bin/printf
$ type echo
echo is a shell builtin
$ …
Run Code Online (Sandbox Code Playgroud) 更新:
一些背景:
zsh
在函数内部调用时返回函数内部的行号$LINENO
。我需要一种方法来获取文件中的行号并区分何时zsh
给我文件行号与函数行号。
我找不到一个zsh
环境变量来改变这种行为以匹配其他 Bourne shell(例如bash
总是给出文件行号),所以我试图看看我是否可以创建一个具有逻辑的函数,不管它总是输出文件行号的上下文。这就是为什么我试图确定函数的长度。
如果任何人的一个好办法知道与获取文件的行号$LINENO
在zsh
所有环境中,我将不胜感激!
题:
我已经搜索了this和this,但似乎找不到答案。是否有一种可移植的方法来编写函数定义的行数?(请参阅上面的“一些背景”。)
我最初的想法是捕获函数内容并将其通过管道传输到wc -l
.
考虑以下测试文件:
测试文件:
#! /bin/sh
#
# test_file.sh
func1() { echo 'A one-liner'; } # With a nasty comment at the end
func2 (){
echo "A sneaky } included"
# Or an actual code block
{
echo 'hi'
echo 'there'
}
}
func3() { echo "I'm on a line."; }; …
Run Code Online (Sandbox Code Playgroud)