Не знаю, правильно ли вы расстались с bash
.
Потому что я давно перестал работать с bash.
Но если вам нужен вывод find в цикле, попробуйте следующее:
find . -name '*.xlsx' -print0 |
while IFS= read -r -d $'\0' z; do
name="${z%%_*}"
dest=".${name//[ .-]/}"
mkdir "$dest"
done
Когда вы запускаете:
chroot $target_dir echo this is a test > /tmp/test
> /tmp/test
происходит "для" команды chroot, как если бы вы написали:
> /tmp/test chroot $target_dir echo this is a test
Если вы хотите перенаправление происходит внутри команды chroot, одним из способов будет:
chroot $target_dir sh -c 'echo this is a test > /tmp/test'
... поскольку это помещает sh
внутри chroot, позволяя эхо видеть правильный перенаправленный каталог.
На самом деле перенаправление не происходит внутри chroot
. > /tmp/test
обрабатывается любой оболочкой, которую вы используете. Если вы на самом деле передали > /tmp/test
вchroot
, тогда он будет передан в echo
, и вы увидите
this is a test > /tmp/test
на своем терминале. Ваша оболочка, конечно же, не получает chroot
ed, так что вполне нормально открывать /tmp/test
. Затем оболочка exec
запускает исполняемый файл chroot
, который вызывает системный вызов chroot
, а затем exec
в echo
, который, наконец, пишет в файл fd.При этом исходный файловый дескриптор, открытый вашей (un chroot
ed) оболочкой, никогда не изменяется, поэтому ваш chroot
ed echo
может писать в него. .
Это преднамеренная функция. Процессу вне chroot
разрешено открывать файлы, а затем его chroot
ed-потомки могут получить доступ только к тем файлам за пределами chroot
, которые родительский процесс соизволил передать им.
Если вы хотите, чтобы перенаправление происходило внутриchroot, вам нужно создать оболочку, которая знает, как его интерпретировать:
chroot $dir bash -c "echo this is a test > /tmp/test"
Теперь порядок операций следующий: fork
(со стандартным вводом, выводом и выводом по умолчанию), exec
chroot
, chroot
(теперь внутри chroot), exec
bash
(знает как обрабатывать перенаправление), fork
(подробности реализации bash
), open file, exec
echo
(с новым стандартным выводом).