From d4f3db9427c443b2709fc9a00bc46d8a71be806b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 30 Oct 2016 18:41:01 +0100 Subject: ash: if using libc glob(), skip it if no metachars are in word This saves making tons of pointless stat() calls function old new delta expandarg 888 921 +33 Signed-off-by: Denys Vlasenko --- shell/ash.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'shell') diff --git a/shell/ash.c b/shell/ash.c index d617168b9..ecd2146e4 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -7047,6 +7047,21 @@ expandmeta(struct strlist *str /*, int flag*/) if (fflag) goto nometa; + + /* Avoid glob() (and thus, stat() et al) for words like "echo" */ + p = str->text; + while (*p) { + if (*p == '*') + goto need_glob; + if (*p == '?') + goto need_glob; + if (*p == '[') + goto need_glob; + p++; + } + goto nometa; + + need_glob: INT_OFF; p = preglob(str->text, RMESCAPE_ALLOC | RMESCAPE_HEAP); // GLOB_NOMAGIC (GNU): if no *?[ chars in pattern, return it even if no match -- cgit v1.2.3