Установка IFS
только к новой строке недостаточно. (Почему Вы также разделяете в символах возврата, между прочим?),
В Вашем коде, ${ROWS[@]}
(который является странным способом записать $ROWS
— ROWS
не массив), не дважды заключается в кавычки. (Если бы это были внутренние двойные кавычки, то Вы получили бы единственную строку с тех пор ROWS
не массив.), Таким образом, оболочка разделяет значение переменной в поля в каждом IFS
символ, затем рассматривает каждое поле как шаблон шарика. Например, если одна из строк, распечатанных командой, содержит отдельный символ *
, это будет заменено именами файлов в текущем каталоге.
Можно выключить globbing с set -f
. В большинстве случаев, где Вы устанавливаете IFS
для использования полевой функции разделения оболочки также необходимо выключить globbing. Задержите его на с set +f
.
Надежная идиома для чтения вывода команды линию за линией while IFS= read -r
.
some command returning multiple lines |
while IFS= read -r ROW; do
…
done
Обратите внимание, что большинство оболочек выполняет каждую команду конвейера в отдельной подоболочке. Таким образом, если необходимо установить переменные и использовать их после цикла, перенести эти команды в группу вместе с циклом. (Ksh и zsh являются исключениями, они выполняют последнюю команду конвейера в родительской оболочке.)
some command returning multiple lines | {
while IFS= read -r ROW; do
…
row_count=$((row_count+1))
done
echo "There were $row_count rows."
}
Поместить -mapall=user
в Ваш exports
файл.
Посмотрите man exports
для деталей
Это возможно, посмотрите на раздел отображения идентификатора пользователя в странице справочника экспорта.
В основном Вы хотите это в строке экспорта: all_squash anonuid=whatever anongid=whatever
Если Вы не находитесь на Linux, а на BSD, сделайте то, что сказал Chris S.