Я концентрируюсь на Linux, но мой ответ, вероятно, подходит для других POSIX-систем.
Вы выполните скрипт оболочки из программы на Си или Си++ с некоторыми из них:
обычной смесью fork(2), execve(2), waitpid(2), и затем waitpid
выдает код выхода с помощью WEXITSTATUS
, когда WIFEXITED
система system(3) функция стандартной библиотеки С. Она возвращает то, что внутренняя waipid
реализация возвращает
функцию стандартной библиотеки POSIX popen(3). Используйте WEXITSTATUS
по результату pclose
Обе системы и
popen
используют вилку ,
exec
, waitpid
системные вызовы (а некоторые другие, список см. в syscalls(2)).
Прочитайте любую хорошую книгу по системному программированию в Linux для подробностей (например, Advanced Linux Programming by M.Mitchell et al; вы найдете copies in Web, или APUE etc...)
.
Использование массива вместо строки:
files=( file1 file2 "filename with spaces" file50 "*my* file" )
cksum "${files[@]}"
Обратите внимание, что каждая двойная кавычка выше важна, особенно если у вас есть имена файлов с пробелами или символами подстановки имени файла.
Чтобы объяснить, почему cksum {${Z//\ /,}}
не работает так, как вы ожидали:
cksum {file1,file4}
Когда вы вводите eval
в микс,вы явно просите оболочку еще раз просмотреть список расширений. Теперь мы можем получить расширение скобок для команды cksum {file1,file4}
, и вы получите контрольные суммы для этих двух файлов.