Это ожидаемо — подробности см. на справочной странице . эта цитата All commands of a pipeline are executed in separate subshells
и следующая запись FAQ:
Something is going wrong with my while...read loop
Most likely, you've encountered the problem in which the shell runs all
parts of a pipeline as subshell. The inner loop will be executed in a
subshell and variable changes cannot be propagated if run in a pipeline:
bar | baz | while read foo; do...; done
Note that exit in the inner loop will only exit the subshell and not the
original shell. Likewise, if the code is inside a function, return in
the inner loop will only exit the subshell and won't terminate the func‐
tion.
Use co-processes instead:
bar | baz |&
while read -p foo; do...; done
exec 3>&p; exec 3>&-
If read is run in a loop such as while read foo; do...; done then lead‐
ing whitespace will be removed (IFS) and backslashes processed. You
might want to use while IFS= read -r foo; do...; done for pristine I/O.
Similarly, when using the -a option, use of the -r option might be pru‐
dent (“read -raN-1 arr "
done
Итак, давайте преобразуем ваш код (также заменили первые две строки на одну, которая правильно очищает массив):
set -A F_ARR
find "$CDIR" ! -type d -mtime +7 -print0 |&
while IFS= read -d '' -pr pathname; do
F_ARR+=("$pathname")
done
echo ${#F_ARR[@]}
Для этого требуется find (1 ), который поддерживает параметр -print0
, и достаточно свежий mksh
на стороне выполнения для поддержки -d ''
для строк с завершением -NUL. Если ваша оболочка Korn более старая, сделайте это без (, но тогда она также не будет поддерживать +=(…)
, так что, скорее всего, она достаточно новая ).
Полное раскрытие :Я mksh разработчик.
Вот как это было исправлено
После обращения в гильдию по устранению неполадок я читал о SELinux, когда в Google искал, что они используют другой жесткий диск. Если вы не делитесь папкой, которая находится на том же жестком диске, на котором установлена ОС, вы должны делать что-то по-другому, в моем случае у меня есть жесткий диск емкостью 2 ТБ, который является хранилищем данных для этого сервера, и чем я хотел поделиться через Самба
По поводу сбоя сервера я нашел этот пост, который помог мне в правильном направлении
https://serverfault.com/questions/395486/i-can-connect-to-samba-server-but-cannot-access-shares
Я узнал, что мне нужно изменить разрешение в точке монтирования, в моем случае /NetworkData2, и добавить его в SELinux.
После того, как я завершил это, я смог получить доступ к папке в Windows Files Explorer и к файлам моего компьютера с Linux, однако возникла другая проблема, когда у меня не было разрешения на запись в папку. Оказывается, root имел контроль над папкой и не позволял в ней ничего писать. поэтому я изменил разрешения на папку / NetworkData2, и я не могу читать и писать в нее и из нее, и общие ресурсы работают.