Comment Comment by coldtea Well, FreeBSD does it by calling a sh builtin: /* * We are the child; make /bin/sh expand `words'. */ (void)__libc_sigprocmask(SIG_SETMASK, &oldsigblock, NULL); if ((pdes[1] != STDOUT_FILENO ? _dup2(pdes[1], STDOUT_FILENO) : _fcntl(pdes[1], F_SETFD, 0)) < 0) _exit(1); if (_fcntl(pdesw[0], F_SETFD, 0) < 0) _exit(1); execl(_PATH_BSHELL, "sh", flags & WRDE_UNDEF ? "-u" : "+u", "-c", "IFS=$1;eval \"$2\";" "freebsd_wordexp -f \"$3\" ${4:+\"$4\"}", "", ifs != NULL ? ifs : " \t\n", flags & WRDE_SHOWERR ? "" : "exec 2>/dev/null", wfdstr, flags & WRDE_NOCMD ? "-p" : "", (char *)NULL); _exit(1); } parent coldtea 7 years ago