Bash shell glob扩展在ls-l*中是如何工作的?

Bash shell glob扩展在ls-l*中是如何工作的?,bash,shell,system-calls,glob,Bash,Shell,System Calls,Glob,shell如何像中那样扩展“*” ls-l* 是否有任何系统调用发生在后台以读取目录中的所有文件?我尝试了strace,但没有显示任何特定于globbing的系统调用。Globbing将使用多个:,(使用…)。另见 和Linux一样,您可以下载它的源代码并对其进行研究、编译和改进 您可以使用或理解GNUBash(或任何其他Linux应用程序)的工作原理 当然,globbing是由shell(before和…)完成的,而不是由/bin/ls进程执行的。Globbing将使用多个:,(使用…)。另见

shell如何像中那样扩展“*”

ls-l*

是否有任何系统调用发生在后台以读取目录中的所有文件?我尝试了strace,但没有显示任何特定于globbing的系统调用。Globbing将使用多个:,(使用…)。另见

和Linux一样,您可以下载它的源代码并对其进行研究、编译和改进

您可以使用或理解GNUBash(或任何其他Linux应用程序)的工作原理

当然,globbing是由shell(before和…)完成的,而不是由
/bin/ls
进程执行的。Globbing将使用多个:,(使用…)。另见

和Linux一样,您可以下载它的源代码并对其进行研究、编译和改进

您可以使用或理解GNUBash(或任何其他Linux应用程序)的工作原理


当然,globbing是由shell(before和…)完成的,而不是由
/bin/ls
进程来完成的。glob是由bash扩展的,而不是由
ls
扩展的。当您运行
strace ls*
时,只跟踪
ls
,但glob在
ls
之前展开,甚至在
strace
运行之前展开,因此您不会在跟踪中看到它的系统调用

要跟踪glob的扩展,请使用
strace bash-c'echo*'
。这还包括来自shell启动的系统调用。要仅显示为echo*完成的系统调用,您可以使用

strace bash -c '[ -e startglob ]; echo *; [ -e endglob ]' 2>&1 |
sed -n '/"startglob"/,/"endglob"/p'

glob由bash扩展,而不是由
ls
扩展。当您运行
strace ls*
时,只跟踪
ls
,但glob在
ls
之前展开,甚至在
strace
运行之前展开,因此您不会在跟踪中看到它的系统调用

要跟踪glob的扩展,请使用
strace bash-c'echo*'
。这还包括来自shell启动的系统调用。要仅显示为echo*完成的系统调用,您可以使用

strace bash -c '[ -e startglob ]; echo *; [ -e endglob ]' 2>&1 |
sed -n '/"startglob"/,/"endglob"/p'
shell是如何扩展
*
ls-l*

当遇到像
*
这样的全局模式时,shell读取所有目录条目,并将它们逐个与模式进行比较

快速浏览一下源代码,我就知道这可能是在中完成的,尤其是在函数中

是否有任何系统调用发生在后台以读取目录中的所有文件

当然,如果没有内核的帮助,您无法读取目录的内容

也就是说,系统调用是低级的,所以不要期望找到任何对
opendir()
readdir()
的调用,它们都是libc调用。相反,您将找到对
open()
getdents()
/
getdents64()
的调用

我尝试了strace,但没有显示任何特定于globbing的系统调用

strace
不是合适的工具。这不是正在进行全局化的内核,这是shell,可能借助libc函数,因此不涉及系统调用(除了上面提到的读取目录内容的低级调用)

如果要跟踪对库函数的调用,如
opendir()
readdir()
glob()
strcmp()
,。。。您必须使用:

也就是说,Bash有自己的全局化系统,比POSIX标准规定的基本系统更先进,因此它不会依赖于或之类的库函数。不要期望在
ltrace
输出中看到对它们的调用

如果您的目标是在自己的应用程序中使用globbing并研究它是如何实现的,那么您可能想看看
glob()
,它比Bash的globbing更简单(仅供参考,我最近发布了一个使用示例)

shell是如何扩展
*
ls-l*

当遇到像
*
这样的全局模式时,shell读取所有目录条目,并将它们逐个与模式进行比较

快速浏览一下源代码,我就知道这可能是在中完成的,尤其是在函数中

是否有任何系统调用发生在后台以读取目录中的所有文件

当然,如果没有内核的帮助,您无法读取目录的内容

也就是说,系统调用是低级的,所以不要期望找到任何对
opendir()
readdir()
的调用,它们都是libc调用。相反,您将找到对
open()
getdents()
/
getdents64()
的调用

我尝试了strace,但没有显示任何特定于globbing的系统调用

strace
不是合适的工具。这不是正在进行全局化的内核,这是shell,可能借助libc函数,因此不涉及系统调用(除了上面提到的读取目录内容的低级调用)

如果要跟踪对库函数的调用,如
opendir()
readdir()
glob()
strcmp()
,。。。您必须使用:

也就是说,Bash有自己的全局化系统,比POSIX标准规定的基本系统更先进,因此它不会依赖于或之类的库函数。不要期望在
ltrace
输出中看到对它们的调用


如果您的目标是在自己的应用程序中使用globbing并研究它是如何实现的,那么您可能想看看
glob()
,它比Bash的globbing更简单(仅供参考,我最近发布了一个使用示例)。

谢谢@Basile Starynkevitch。我尝试过strace来理解它是如何工作的,并且还通读了BashGithub。我没有看到ls-l和ls-l*之间有多大区别。没有opendir、readdir和getdents调用。strace不是捕获所有全局扩展调用吗?同样,全局绑定是由shell完成的。不是通过
ls
谢谢@Basile Starynkevitch。我哈