C/C++でshellのように"~"や環境変数を展開する方法

bashなどの shell では

  • "~/*"
  • "$HOME/*"

はホームディレクトリ以下のファイル名に展開されます.

これをC/C++で実装する方法です

実装

wordexp(3) を使います

#include <wordexp.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    wordexp_t exp;
    int flags = 0;    
    int ret;
    ret = wordexp("~/*", &exp, flags);     
    if (0 == ret){
        int i;
        for (i=0; i<exp.we_wordc; i++){
            printf("%s\n", exp.we_wordv[i]);
        }
    }
    wordfree(&exp);   
    return 0;
}

なお wordexp は POSIX.1‐2001, POSIX.1‐2008 準拠の関数だそうです.似た関数としては glob や fnmatch がありますが,wordexpは shellのパターンや環境変数も使える点が違います.