首页 > 解决方案 > shell glob 扩展如何像 ls -l * 一样工作?

问题描述

shell如何扩展'*',如

ls -l *

是否有任何系统调用在后台发生以读取目录中的所有文件?我尝试了 strace 但没有显示任何特定于 globbing 的系统调用

标签: bashshellsystem-callsglob

解决方案


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'

推荐阅读