WORDEXP - Linux手册页

时间:2019-08-20 18:01:40  来源:igfitidea点击:

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)。

InterfaceAttributeValue
wordexp()Thread safetyMT-Unsafe race:utent const:env
env sig:ALRM timer locale
wordfree()Thread safetyMT-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);
}

另外参见

fnmatch(3),glob(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/