Почему heredoc "зависят" от дескрипторов файлов?

Я просто хотел поделиться своим опытом: во 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

enter image description here

Кроме того, при попытке удалить каталог Jeff, Я получаю следующее сообщение об ошибке:

$ sudo rm -f -R Jeff
rm: cannot remove 'Jeff': Input/output error

enter image description here

Мне не удалось избавиться от каталога Jeff на компьютере с Linux, поэтому я использовал компьютер с FreeBSD и снова перемонтировал жесткий диск на FreeBSD. Но команды ls, cd и rm во FreeBSD генерируют ту же ошибку ввода/вывода. Похоже, в пакете FreeBSD ntfs-3g обнаружена ошибка.


ОБНОВЛЕНИЕ

Я переместил все свои данные с внешнего жесткого диска на компьютер с Linux, конечно, поврежденный файл Jeff не мог быть перемещен из-за ошибки ввода-вывода.Затем я переформатировал внешний жесткий диск с обнулением тома и проверкой поврежденных секторов следующим образом:

$ sudo mkfs.ntfs /dev/sdb1

А затем переместил все данные обратно на внешний том. Таким образом, я потерял поврежденный файл с именем Джефф, однако на моем внешнем жестком диске нет ошибок ввода-вывода.

0
21.12.2016, 03:37
2 ответа

В вашем первом примере отсутствует cat , ему не нужны файловые дескрипторы.

bash << EOF0 

command1
cat << E0F1
        Proudly_Printed_With_Heredoc
EOF1

E0F0

однако файловые дескрипторы необходимы, если вы хотите взаимодействовать с некоторыми командами вместо того, чтобы они получали ввод от heredoc.

4
28.01.2020, 02:19

Чтобы понять этот ответ, необходимо введение со всей концепцией «файловых дескрипторов» - Что такое «файловый дескриптор» и зачем нам это нужно.Если у вас уже есть такое введение, перейдите к ответу ниже; не --- Пожалуйста, прочтите мой ответ в этой ветке SE, а затем возвращайтесь .

Ответ:

Во втором способе, который я представил в вопросе, мы передаем в Bash heredoc для файлового дескриптора, отличного от 0 (в данном случае - 5:

Первая часть фразы, ] bash / dev / fd / 5 представляет bash с файловым дескриптором 5 в качестве входных данных, а вторая часть, 5 << EOF , сообщает оболочке, что нужно записать здесь-документ в этот дескриптор файла.

Примечания:

  1. Иерархия heredoc не имеет ничего общего с номером соответствующего файлового дескриптора.
  2. Я дал число 5 только потому, что это хорошее число далеко от нуля. AFAIK, вы могли бы дать 50, 500 или 50 000, и все будет работать так же.
0
28.01.2020, 02:19

Теги

Похожие вопросы