WORDEXP - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
wordexp,freeword-像posix-shell一样执行单词扩展
语法
#包括
int wordexp(const char * s,wordexp_t * p,int标志);
无效的wordfree(wordexp_t * p);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
wordexp(),wordfree():_ XOPEN_SOURCE
说明
函数wordexp()对字符串s进行类似于shell的扩展,并以p指向的结构返回结果。数据类型wordexp_t是至少具有字段we_wordc,we_wordv和we_offs的结构。字段we_wordc是size_t,它给出s扩展中的单词数。 we_wordv字段是一个字符**,指向找到的单词数组。 size_t类型的we_offs字段有时(取决于标志,请参见下文)用于指示we_wordv数组中应填充为NULL的初始元素的数量。
函数wordfree()再次释放分配的内存。更确切地说,它不会释放其参数,但会释放数组we_wordv和指向的字符串。
The string argument
由于扩展与命令的参数通过外壳程序进行的扩展(请参见sh(1))相同,因此字符串s不能包含在shell命令参数中非法的字符。特别是,在命令替换或参数替换上下文之外,不得有任何未转义的换行符或|,&,; 、、、(、、),{,}字符。
如果参数s包含以未加引号的注释字符#开头的单词,则不确定该单词及其后所有单词是否被忽略,或者将#视为非注释字符。
The expansion
完成的扩展包括以下阶段:波浪线扩展(用用户的主目录替换tiuser),变量替换(用环境变量FOO的值替换$ FOO),命令替换(用$(command)或command
替换)。命令输出),算术扩展,字段拆分,通配符扩展,引用删除。
未指定特殊参数($ @,$ *,$#,$?,$-,$$,$!,$ 0)的扩展结果。
使用环境变量$ IFS完成字段拆分。如果未设置,则字段分隔符为空格,制表符和换行符。
The output array
数组we_wordv包含找到的单词,后跟NULL。
The flags argument
flag参数是以下值的按位"或"或:
- WRDE_APPEND
- 将找到的单词附加到上一次调用产生的数组中。
- WRDE_DOOFFS
- 在数组we_wordv中插入we_offs初始NULL。 (这些不计入返回的we_wordc中。)
- WRDE_NOCMD
- 不要执行命令替换。
- WRDE_REUSE
- 参数p是由先前对wordexp()的调用产生的,而没有调用wordfree()。重新使用分配的存储。
- WRDE_SHOWERR
- 通常,在命令替换期间,stderr会重定向到/ dev / null。此标志指定不重定向stderr。
- WRDE_UNDEF
- 如果扩展了未定义的shell变量,则将其视为错误。
返回值
如果成功,则返回0。如果发生错误,则返回以下五个值之一。
- WRDE_BADCHAR
- 非法出现换行符或|,&,;,(,(,),{,})之一。
- WRDE_BADVAL
- 引用了一个未定义的shell变量,并且WRDE_UNDEF标志告诉我们将此视为错误。
- WRDE_CMDSUB
- 请求了命令替换,但是WRDE_NOCMD标志告诉我们将此视为错误。
- WRDE_NOSPACE
- 内存不足。
- WRDE_SYNTAX
- Shell语法错误,例如不平衡的括号或不匹配的引号。
版本
从2.1版开始,glibc中提供了wordexp()和wordfree()。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
wordexp() | Thread safety | MT-Unsafe race:utent const:env env sig:ALRM timer locale |
wordfree() | Thread safety | MT-Safe |
在上表中,race:utent中的utent表示如果在程序的不同线程中并行使用setutent(3),getutent(3)或endutent(3)中的任何功能,则可能发生数据争用。 wordexp()调用这些函数,因此我们使用race:utent来提醒用户。
遵循规范
POSIX.1-2001,POSIX.1-2008。
示例
下面的示例程序的输出大约是" ls [a-c] *。c"的输出。
#include <stdio.h> #include <stdlib.h> #include <wordexp.h> int main(int argc, char **argv) { wordexp_t p; char **w; int i; wordexp("[a-c]*.c", &p, 0); w = p.we_wordv; for (i = 0; i < p.we_wordc; i++) printf("%s\n", w[i]); wordfree(&p); exit(EXIT_SUCCESS); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。