Я просто хотел поделиться своим опытом: во FreeBSD 10.3 я смонтировал внешний жесткий диск с помощью
$ sudo ntfs-3g /dev/da0s1 /media
Внутри жесткого диска я сделал mkdir
, чтобы создать каталог, а затем переместил в него некоторые файлы, конечно, с помощью команды mv
. В конце концов я выполнил следующую команду:
$ sudo sync
Затем я смонтировал жесткий диск на машине Linux с ядром 4.4.0-78-generic. Теперь, когда я перечисляю содержимое жесткого диска, созданный во FreeBSD каталог с именем Jeff
выглядит следующим образом:
$ ls -lhrtci
ls: cannot access 'Jeff': Input/output error
total 20K
? d????????? ? ? ? ? ? Jeff
Кроме того, при попытке удалить каталог Jeff
, Я получаю следующее сообщение об ошибке:
$ sudo rm -f -R Jeff
rm: cannot remove 'Jeff': Input/output error
Мне не удалось избавиться от каталога Jeff
на компьютере с Linux, поэтому я использовал компьютер с FreeBSD и снова перемонтировал жесткий диск на FreeBSD. Но команды ls
, cd
и rm
во FreeBSD генерируют ту же ошибку ввода/вывода
. Похоже, в пакете FreeBSD ntfs-3g
обнаружена ошибка.
Я переместил все свои данные с внешнего жесткого диска на компьютер с Linux, конечно, поврежденный файл Jeff
не мог быть перемещен из-за ошибки ввода-вывода.Затем я переформатировал внешний жесткий диск с обнулением тома и проверкой поврежденных секторов следующим образом:
$ sudo mkfs.ntfs /dev/sdb1
А затем переместил все данные обратно на внешний том. Таким образом, я потерял поврежденный файл с именем Джефф
, однако на моем внешнем жестком диске нет ошибок ввода-вывода.
В вашем первом примере отсутствует cat
, ему не нужны файловые дескрипторы.
bash << EOF0
command1
cat << E0F1
Proudly_Printed_With_Heredoc
EOF1
E0F0
однако файловые дескрипторы необходимы, если вы хотите взаимодействовать с некоторыми командами вместо того, чтобы они получали ввод от heredoc.
Чтобы понять этот ответ, необходимо введение со всей концепцией «файловых дескрипторов» - Что такое «файловый дескриптор» и зачем нам это нужно.Если у вас уже есть такое введение, перейдите к ответу ниже; не --- Пожалуйста, прочтите мой ответ в этой ветке SE, а затем возвращайтесь .
Во втором способе, который я представил в вопросе, мы передаем в Bash heredoc для файлового дескриптора, отличного от 0 (в данном случае - 5:
Первая часть фразы, ] bash / dev / fd / 5
представляет bash с файловым дескриптором 5 в качестве входных данных, а вторая часть, 5 << EOF
, сообщает оболочке, что нужно записать здесь-документ в этот дескриптор файла.