файлы cksum, использующие заменяемую строку переменных в качестве шаблона

Я концентрируюсь на 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...)

.

1
16.04.2018, 16:27
2 ответа

Использование массива вместо строки:

files=( file1 file2 "filename with spaces" file50 "*my* file" )

cksum "${files[@]}"

Обратите внимание, что каждая двойная кавычка выше важна, особенно если у вас есть имена файлов с пробелами или символами подстановки имени файла.

3
27.01.2020, 23:18

Чтобы объяснить, почему cksum {${Z//\ /,}}не работает так, как вы ожидали:

  1. в соответствии с bash порядком замен/расширений , раскрытие фигурных скобок происходит перед подстановками параметров
  2. однако, документировано , что «во избежание конфликтов с расширением параметра строка ‘${’ не считается подходящей для расширения фигурной скобки». --поэтому bash не выполняет раскрытие фигурных скобок здесь.
  3. , затем оболочка в конечном итоге переходит к подстановке параметров, и команда расширяется доcksum {file1,file4}
  4. оболочка не возвращается назад и не -выполняет список расширений, поэтому мы не получаем раскрытие фигурных скобок снова :у нас остается одно слово "{file1,file4}"
  5. и такого файла нет.

Когда вы вводите evalв микс,вы явно просите оболочку еще раз просмотреть список расширений. Теперь мы можем получить расширение скобок для команды cksum {file1,file4}, и вы получите контрольные суммы для этих двух файлов.

1
27.01.2020, 23:18

Теги

Похожие вопросы