Фактически cat
не зависит от $TMPDIR
, но перенаправление оболочки <<
зависит.
В этом случае кажется, что cat
пытается выполнить fstat()
наstdin
(fd 0 ), и по какой-то причине это не удается (из strace):
fstat(0, 0x7ffe16cc1ec0) = -1 ENOENT (No such file or directory)
В обычных условиях это не проблема:
strace -f cat <<FOO
> bar
> FOO
execve("/usr/bin/cat", ["cat"], [/* 91 vars */]) = 0
...
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0),...}) = 0
fstat(0, {st_mode=S_IFREG|0600, st_size=4,...}) = 0
fadvise64(0, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4844156000
read(0, "bar\n", 131072) = 4
write(1, "bar\n", 4bar
) = 4
read(0, "", 131072) = 0
munmap(0x7f4844156000, 139264) = 0
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
Итак, еще раз :Это не ошибка в cat
, а какая-то ошибка в виртуальной среде.
Быстрый тест преобразования кириллицы из UTF8 в UTF7
echo 'Here we go. Це коротке речення' | iconv -f utf-8 -t utf-7
Here we go. +BCYENQ +BDoEPgRABD4EQgQ6BDU +BEAENQRHBDUEPQQ9BE8
Читая описание кодировки UTF7 , я вижу, что (грубо говоря )каждой закодированной строке должен предшествовать +
. В вашем списке каталогов UTF7 такого префикса нет.
Теперь, как вы видели, преобразование &
в +
в извлеченных вами данных не приводит к созданию допустимых кодовых точек,
echo '&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-/' | tr '&' + | iconv -f utf-7 -t utf-8
От
iconv: (stdin):1:2: cannot convert
НО, если вы возьмете сами имена файлов, вы получите действительное преобразование, как только вы переключите &
на +
,
echo '&BCMENAQwBDsENQQ9BD0ESwQ1-' | tr '&' + | iconv -f utf-7 -t utf-8
Удаленные
В сущности, этот вопрос поставлен неправильно -. Дело в том, что IMAP(ab)использует utf-7. Это почти utf-7, но не совсем. В конце концов я решил свою проблему, используя этот код php из комментария документации php: