Никогда не использовать:
for d in $(ls)
Используйте вместо этого:
for d in *
Две проблемы, среди прочих, связанные с использованием $(ls)
заключаются в том, что оболочка подвергает результаты $(ls)
–разбиению слов и расширению имени пути . В вашем случае разделение слов привело к тому, что mozilla foundation
превратилось в mozilla
и foundation
.
Более подробное обсуждение причин не использовать $(ls)
см. в "Что делает $(ls *.txt)
?"
Если вам нужно учитывать случай, когда в каталоге (нет не -скрытого файла, случай, когда for i in $(ls)
может выглядеть лучше, поскольку он не выполняет никакого прохода в цикле, в отличие от один проход в цикле с *
как $i
в for i in *
(, за исключением zsh
)), вы хотите указать оболочке не расширяться ни к чему для не -совпадающих глобусов:
zsh
:for i in *(N)
ksh93
:for i in ~(N)*
bash4.4+
:f() { local -; shopt -s nullglob; for i in *;...; done; }; f
(смысл в том, чтобы использовать опцию nullglob
локально (см. также опцию failglob
для поведения, аналогичного zsh
по умолчанию )). yash
:set -o nullglob
(и затем сброс, насколько я знаю, нет локальной области для параметров в yash
)[ -e "$i" ] || [ -L "$i" ] || continue
в цикл для проверки существования файла. Вы можете создавать объекты-компоненты разделяемой библиотеки отдельно:
gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.c addvec.o multvec.o
Обратите внимание, однако, что все этапы компиляции и компоновки должны использовать одни и те же флаги. Я подозреваю, что это основная причина подхода, используемого в вашем учебнике. Статической библиотеке не нужен независимый от позиции -код, а разделяемой библиотеке он нужен. Вместо того, чтобы явно создавать отдельные объектные файлы дважды или «тратить» PIC на статическую библиотеку, общая библиотека создается с использованием PIC из исходных файлов.