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