Проблемой здесь не является проблема с перенаправлением Linux; скорее это - фундаментальное неверное толкование того, как конвейер работает. Перенаправление здесь не работает, потому что только сокращенный на самом деле печатает к stdout. stdout для команды эха, был передан по каналу к stdin сокращения (который не используется в этом случае, так как файл указан).
echo "header line" > output_file && cut -c 1-5 input_file >> output_file
то, что Вы хотите, и весьма изящный вообще (я заменил Ваш ;
с &&
так, чтобы команда сокращения только выполнилась, если заголовок будет успешно записан; этим путем это не выполнится, если у Вас не будет полномочий создать или записать в output_file).
Вы могли также сделать все это в подоболочке, например.
(echo "header line"; cut -c 1-5 input_file) > output_file
но нет никакой реальной выгоды для выполнения этого, и с более сложными примерами оно может вызвать проблемы, если Вы не знакомы с тем, как подоболочка ограничена по объему.
Если Вы хотите, чтобы сокращение передало stdin до stdout, Вы могли бы попробовать:
echo "header line" | cut -c 1-5 - input_file
(Тире является общим ярлыком для stdin),
Однако это также выполнит операцию сокращения на stdin (приводящий к строке заголовка "заголовка"). Трудно сказать, является ли это тем, что Вы хотите или не от вопроса.
В драйвере цикла loop
поддержка разделов является необязательной, что определяется аргументом max_part
, когда драйвер загружен. Значение по умолчанию - 0, поэтому драйвер цикла даже не будет искать разделы; с ненулевым значением драйвер поддерживает такое количество разделов. В зависимости от параметров сборки ядра драйвер может быть либо включен в ядро, и в этом случае вам нужно передать loop.max_part =…
в командной строке ядра во время загрузки, либо он может быть загружен как модуль. , в этом случае вам нужно передать max_part =…
, когда модуль загружен.
В Debian wheezy цикл
является модулем, и аргумент max_part
не передается.Чтобы получить поддержку разделов, выгрузите модуль и загрузите его обратно с аргументом max_part
(вам нужно сначала деактивировать любое существующее устройство цикла с помощью losetup -d
):
if lsmod | grep -wq loop; then rmmod loop; fi
modprobe loop max_part=31
Вы это можно сделать по умолчанию, добавив options loop max_part = 31
в /etc/modprobe.conf
.
Если вы не можете позволить себе выгрузку модуля (или перезагрузку в дистрибутиве, где цикл
встроен в ядро), вы можете вместо этого вычислить смещение раздела вручную и использовать -o
параметр для losetup
. См.
Чтение файловой системы из всего образа диска
В новых дистрибутивах, вы можете использовать losetup -P
при настройке устройства петли :
…
losetup -P -f arch-rpi.img
…
, но пакет util-linux
в Debian wheezy слишком стар, чтобы иметь эту опцию.
Вам нужно использовать losetup -P
для создания -P
созданное устройство цикла, иначе вам нужно разделить исходное устройство цикла, а затем partx -u
pdate таблицу разделов ядра. Устройства / dev / loop0p
появятся после того, как ядро распознает, что раздел действительно был разбит на разделы. Вероятно, это отчасти то, что подразумевается за сном 5
- но это почти наверняка должна быть синхронизация
- или и то, и другое - вместо этого.
В любом случае, чтобы продемонстрировать:
sudo sh -s <<\IN
losetup -D
fallocate "-l$((1024*1024*1024))" loop
printf %s\\n n '' '' '' '' w y | gdisk loop
sync; losetup -f loop
lsblk /dev/loop*
IN
Таким образом, приведенная выше последовательность сначала -D
очищает все текущие устройства контура (если есть) fallocate
в tmp-файле размером 1 ГБ, записывает Таблица разделов GPT для него и делает на нем один раздел, затем синхронизирует
файловую систему и назначает ее первому доступному устройству цикла -f
, прежде чем пытаться внести в список с помощью lsblk
все доступные устройства шлейфа. Он напечатает:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 1G 0 loop
Но , если я изменю строку losetup
на:
losetup -fP loop
... вместо этого он напечатает:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 1G 0 loop
├─loop0p1 259:0 0 1023M 0 loop
└─loop0p2 259:1 0 1007K 0 loop
... потому что сначала losetup
сканирует резервный файл в поисках таблицы разделов.Как видите, он не очень хорош в этом - вместо того, чтобы отмечать лишний 1M (который почти определенно является таблицей разделов последней итерации, на самом деле) как нераспределенное пространство, он интерпретирует его как отдельный раздел, но это вероятно, потому что я пишу в tmpfs (дважды подряд) в верхней части файловой дыры размером 1 ГБ - работа с фактическими данными будет намного точнее (и обнуление файла резервной копии как ваш сценарий делает w / dd
все равно справится с этим) . В любом случае - я могу свободно mkfs.whatever
на реальном разделе там, а потом смонтировать
его. partx -u
в / dev / loop0
даст те же результаты.