Loop в linux что это
Loop в linux что это
Другой пример смотрите в losetup(8).
Для шифрования и расшифровки каждому закольцованному устройству может быть назначена функция обмена.
Для закольцованного блочного устройства доступны следующие операции ioctl(2):
LOOP_SET_FD Связывает закольцованное устройство с открытым файлом, чей файловый дескриптор передаётся в третьем аргументе ioctl(2). LOOP_CLR_FD Отвязывает закольцованное устройство от файлового дескриптора. LOOP_SET_STATUS Назначает состояние (передаваемое в третьем аргументе ioctl(2)) закольцованному устройству. Данный аргумент представляет собой указатель на структуру loop_info, определённую в следующим образом:
Типом шифрования (lo_encrypt_type) должно быть одно из значений: LO_CRYPT_NONE, LO_CRYPT_XOR, LO_CRYPT_DES, LO_CRYPT_FISH2, LO_CRYPT_BLOW, LO_CRYPT_CAST128, LO_CRYPT_IDEA, LO_CRYPT_DUMMY, LO_CRYPT_SKIPJACK или LO_CRYPT_CRYPTOAPI (начиная с Linux 2.6.0).
Поле lo_flags представляет собой битовую маску, в которой может быть ноль или несколько следующих значений:
LO_FLAGS_READ_ONLY Закольцованное устройство доступно только для чтения. LO_FLAGS_AUTOCLEAR (начиная с Linux 2.6.25) Закольцованное устройство автоматически уничтожится после закрытия. LO_FLAGS_PARTSCAN (начиная с Linux 3.2) Разрешено автоматическое сканирования разделов. LOOP_GET_STATUS Получить состояние закольцованного устройства. В третьем аргументе ioctl(2) должен быть задан указатель на структуру struct loop_info. LOOP_CHANGE_FD (начиная с Linux 2.6.5) Поменять источник данных (backing store) закольцованного устройства на новый файл, определяемый файловым дескриптором, указанным в третьем аргументе ioctl(2), представленный целым числом. Данная операция допустима только, если закольцованное устройство доступно только на чтение и новый источник данных имеет тот же размер и тип, использованный ранее. LOOP_SET_CAPACITY (начиная с Linux 2.6.30) Изменить размер используемого (live) закольцованного устройства. Можно изменить размер используемого источника данных, а затем применить эту операцию для того, чтобы драйвер закольцованных устройств учёл новый размер. У этой операции нет аргументов.
Начиная с Linux 2.6, появилось две новые операции ioctl(2):
LOOP_SET_STATUS64, LOOP_GET_STATUS64 Они подобны описанным выше LOOP_SET_STATUS и LOOP_GET_STATUS, но используют структуру loop_info64, в которой есть несколько дополнительных полей, а некоторым другим полям назначены типы с большим диапазоном значений:
Мини-HOWTO: Зацикленная корневая файловая система
Andrew Bishop
Перевод: Станислав Рогин, SWSoft Pte Ltd.
Версия 1.1, 24 сентября 1999
Этот HOWTO объясняет, как использовать зацикленное (loopback) устройство Linux, чтобы создать файловую систему Linux, которая может запускаться из DOS-раздела без изменения системы разделов. Другое применение этой техники также обсуждается в этом документе.
1. Введение
1.1. Copyright
The Loopback Root Filesystem HOWTO Copyright (C) 1998,99 Andrew M. Bishop (amb@gedanken.demon.co.uk).
This documentation is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
The GNU General Public License is available from http://www.fsf.org/ or, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
1.2. Авторские права
Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.
Этот документ является частью проекта Linux HOWTO.
Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.
Все переводы и производные работы, выполненные по документам Linux HOWTO должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.
1.3. История изменений документа
Первоначальная версия (Июнь 1998)
Добавлена информация о Copyright (Сентябрь 1999)
2. Общие принципы зацикленных устройств и электронных дисков (Ramdisks)
Сначала я опишу некоторые общие принципы, используемые при настройке зацикленной файловой системы в качестве корневого устройства.
2.1. Зацикленные устройства
2.2. Электронные диски
В Linux также может использоваться другой тип виртуального устройства, подключаемый как файловая система, под названием электронный диск.
В этом случае, устройство ссылается не на какое-то физическое устройство, а на часть оперативной памяти, выделенной для этой цели. Эта память никогда не сбрасывается в swap на диск, но остается в дисковом кэше.
Когда электронный диск используется при загрузке (что часто применяется на инсталляционных дисках Linux или дисках аварийного восстановления), тогда образ диска (полное содержимое диска в виде отдельного файла) может содержаться на загрузочном флоппи-диске в закомпрессированной форме. Эта ситуация автоматически распознается ядром, когда оно загружается, и этот образ разжимается в электронный диск перед его подключением.
2.3. Загрузочный электронный диск
Такая необычная процедура необходима потому, что при обычной загрузке система начинает и продолжает загрузку с корневой файловой системы. С загрузочным электронным диском корневая файловая система может быть изменена до начала основной последовательности загрузки Linux.
2.4. Корневая файловая система
Когда система загрузилась, нельзя отключить корневую файловую систему или изменить ее из-за того, что все программы используют ее тем или иным образом. Вот почему так полезен загрузочный электронный диск, поскольку его можно использовать, чтобы конечная корневая файловая система могла быть отлична от той, которая была в момент начала загрузки.
2.5. Последовательность загрузки Linux
Чтобы понять, как загрузочный электронный диск работает в процессе загрузки системы, изучим порядок событий при загрузке системы.
Производится инициализация ядра, включая обработку опций командной строки и подключение электронного диска в виде корневой файловой системы.
Корневое устройство переключается в соответствии с параметром ядра.
Это упрощенное описание того, что происходит на самом деле, но этого достаточно, чтобы описать, как запускается ядро и как используется электронный диск.
3. Как создать зацикленное корневое устройство
Теперь, когда все основные принципы объяснены, можно перейти к созданию зацикленного корневого устройства.
3.1. Требования
Создание зацикленного корневого устройства потребует от вас нескольких вещей.
Систему с работающим Linux-ом.
Способ скопировать большие файлы на DOS-раздел.
Наиболее важно иметь доступ к работающему Linux-у. Это необходимо по причине того, что зацикленное устройство может быть создано только в Linux-е. Это означает, что нельзя создать работающую машину с зацикленной корневой файловой системой из ничего. От этой Linux-системы потребуется возможность собрать на ней ядро.
После создания зацикленное устройство будет представлять из себя большой файл. Я использовал примерно 80 Мб файлов, но этого достаточно только, чтобы сделать Х-терминал, а возможно, если вы захотите чего-то большего, вам потребуется больше места. Этот файл должен быть скопирован на DOS-раздел, то есть придется использовать или сеть, или кучу флоппи-дисков.
Вам также понадобится следующее программное обеспечение:
LOADLIN версии 1.6 или новее
ядро, поддерживающее все необходимые условия.
Это все должно входить в последние инсталляции дистрибутивов Linux.
3.2. Создаем ядро Linux
Я создал зацикленное устройство с использованием ядра версии 2.0.31, другие версии тоже должны работать, но они должны поддерживать все опции, перечисленные ниже.
Опции ядра, которые вам надо будет включить:
Поддержка электронных дисков (RAM disk support) ( CONFIG_BLK_DEV_RAM ).
Поддержка загрузочного электронного диска (Initial RAM disk (initrd) support) ( CONFIG_BLK_DEV_INITRD ).
Поддержка зацикленных устройств (Loop device support) ( CONFIG_BLK_DEV_LOOP ).
Поддержка файловой системы FAT (fat fs support) ( CONFIG_FAT_FS ).
Поддержка файловой системы MSDOS (msdos fs support) ( CONFIG_MSDOS_FS ).
В зависимости от версии вашего ядра, вам, возможно, придется установить патч к ядру. Это очень простой патч, который разрешает использование зацикленной файловой системы в виде корневой.
3.3. Создаем загрузочный электронный диск
Загрузочный электронный диск проще всего создавать, как зацикленное устройство с самого начала. Вы должны делать это в качестве root-а. Список команд, которые вы должны запустить, приведен ниже. Они предполагают запуск из личного каталога root-а ( /root ).
Здесь производится несколько действий, которые можно вкратце описать так:
Создаем точку подключения загрузочного электронного диска (пустой каталог).
Создаем пустой файл необходимого размера. Я здесь использовал 1024 Кб, вам может понадобиться меньше или больше, в зависимости от содержимого (размер задается в последней опции).
Создаем файловую систему ext2 в пустом файле.
Подключаем этот файл к точке подключения, с использованием зацикленного устройства.
Переходим ко вновь подключенному зацикленному устройству.
Создадим там все необходимые файлы (см. ниже).
Выходим из подключенного зацикленного устройства.
Создаем компрессированную версию для дальнейшего использования.
Содержимое загрузочного электронного диска
На загрузочном диске нужно иметь все файлы, необходимые для запуска любых команд:
/linuxrc скрипт, который подключает файловую систему msdos (см. ниже).
/lib/* система динамических связей (dynamic linker) и библиотеки, необходимые программам.
/etc/* Кэш, используемый системой динамических связей (не очень нужен, но после этого перестают выдаваться жалобные сообщения).
/mnt Пустой каталог для подключения msdos-диска.
Содержимое загрузочного электронного диска, которое я использовал, приведено ниже. Оно заняло примерно 800 Кб, если принимать в расчет излишки файловой системы.
Файл /linuxrc на загрузочном электронном диске нужен для того, чтобы произвести все приготовления, необходимые для подключения зацикленного устройства как корневого.
3.4. Создаем корневое устройство
Файл /etc/fstab должен ссылаться на корневой раздел и swap-пространство через два зацикленных устройства, настроенных загрузочным электронным диском.
Таким образом, вы будете уверены в том, что ядро не ошибется относительно реального местоположения корневой файловой системы. Также swap-пространство будет организовано обычным образом так, как будто используется обычный swap-раздел. Вы должны удалить все строки, ссылающиеся на корневое файловое устройство или swap-раздел.
Если хотите иметь возможность читать DOS-раздел под Linux-ом? вам придется внести еще несколько небольших изменений.
Нет необходимости в том, чтобы иметь ядро Linux на этом корневом зацикленном устройстве, так как оно загружено ранее. Если вы используете модули, можете включить их в это устройство обычным образом.
3.5. Создаем Swap-устройство
Размер swap-устройства, которое вы будете использовать, зависит от ваших планов по использованию новой системы, но я бы рекомендовал его от 8 Мб до размера вашей оперативной памяти.
3.6. Создаем каталог MSDOS
Файлы, которые будут нами использоваться, необходимо переписать на DOS-раздел.
В DOS-каталоге C:\LINUX должны находиться следующие файлы:
LINUXDSK.IMG Образ диска, который станет корневой файловой системой.
3.7. Создаем загрузочный флоппи-диск
Загрузочный флоппи-диск, который мы будем использовать, является простым загрузочным диском DOS.
AUTOEXEC.BAT Автоматически запускаемый командный файл DOS.
INITRDGZ.IMG Компрессированный образ загрузочного электронного диска.
В файле AUTOEXEC.BAT должна быть только одна строка.
Здесь указано, какой образ ядра использовать, какой образ загрузочного электронного диска использовать, а также корневая файловая система, которая должна быть подключена «только для чтения».
4. Загрузка системы
Для загрузки нового корневого устройства необходимо, чтобы флоппи-диск, описанный выше, был вставлен в компьютер при его загрузке.
Вы увидите следующую последовательность событий.
Загрузка в память ядра Linux
Загрузка в память загрузочного электронного диска
Запуск файла /linuxrc с загрузочного электронного диска
Подключение DOS-раздела и настройка корневого и swap-устройств
Последовательность загрузки продолжается с зацикленного устройства
Когда все это пройдет, вы можете убрать флоппи-диск и использовать Linux.
4.1. Возможные проблемы и их решение
Существует ряд причин, по которым что-то в этом процессе идет не так. Я попытаюсь объяснить, в чем они заключаются, и что необходимо проверить.
Когда ядро декомпрессирует себя, оно может выдать сообщение о crc-ошибках, если ядро повреждено. Затем начнется инициализационная последовательность, которая содержит очень много диагностических сообщения. Загрузка в память загрузочного электронного диска также видна на этой фазе.
Когда последовательность загрузки закончится, может возникнуть проблема, состоящая в том, что некоторые программы не очень хорошо понимают, подключен ли DOS-раздел. Поэтому я советую использовать «поддельную» команды mount, описанную выше. Она значительно упростит жизнь, если вы хотите использовать файлы на DOS-устройстве.
4.2. Ссылки на другие документы
При создании моей первой зацикленной корневой файловой системы я использовал следующие источники информации:
Исходные тексты ядра Linux, в особенности init/main.c
5. Другие возможности зацикленных корневых устройств
Мы подробно описали возможность загрузки корневой файловой системы из DOS-раздела, но существует много других вещей, которые вы можете сделать.
5.1. Установка на DOS-жесткий-диск
Если возможно загрузить Linux из файла на жестком диске с раздела DOS, используя загружаемый флоппи, то, очевидно, возможно загрузить его и с самого жесткого диска.
5.2. Установка с загрузкой при помощи LILO
5.3. Установка на VFAT / NTFS
Я использовал этот метод и с NTFS, и у меня не возникло никаких проблем. Драйвер файловой системы NTFS не входит в стандартную поставку ядра версий 2.0.x, но доступен в виде патча по адресу http://www.informatik.hu-berlin.de/
Единственное изменение, касающееся VFAT или NTFS, должно быть внесено в загрузочный электронный диск, а конкретнее, в файл /linuxrc : при подключении файловой системы необходимо указать тип файловой системы vfat или ntfs, вместо msdos.
Я не знаю причин, по которым это не должно работать в разделе VFAT.
5.4. Установка Linux без изменения разделов
Процесс установки Linux на компьютер со стандартного дистрибутива предполагает загрузку с флоппи-диска и изменение структуры разделов диска. Вместо этого можно создать загружаемый флоппи-диск, который создаст пустое зацикленное устройство и swap-файл. После этого установка может быть продолжена обычным образом, просто система будет установлена в зацикленное устройство вместо раздела.
5.5. Загрузка с незагружаемого (Non-bootable) устройства
Вышеописанный метод можно также использовать для загрузки Linux-а с устройства, которое обычно не является загружаемым.
Диски на параллельном порте
Очевидно, что и многие другие устройства могут быть использованы также. Корневые файловые системы NFS включены в ядро в виде опции, но этот способ может быть использован в качестве альтернативы.
Bash For Loop в Linux
Bash For Loop в Linux
В этом руководстве мы покажем вам, как использовать bash for loop в системах Linux. Для тех из вас, кто не знал, циклы являются одной из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие. Как и любой другой язык программирования, сценарии оболочки bash также поддерживают циклы for для выполнения повторяющихся задач. Это помогает нам перебирать определенный набор операторов по серии слов в строке или элементам в массиве.
В этой статье предполагается, что у вас есть хотя бы базовые знания Linux, вы знаете, как использовать оболочку, и, что наиболее важно, вы размещаете свой сайт на собственном VPS. Установка довольно проста и предполагает, что вы работаете с учетной записью root, в противном случае вам может потребоваться добавить ‘ sudo ‘ к командам для получения привилегий root.
Bash For Loop в Linux
Вы можете подать заявку на цикл в сценарии bash различными способами. В этой статье упоминаются некоторые полезные примеры BASH для циклов.
Вот пример того, как Bash For Loop принимает форму:
Теперь посмотрим на стандартный Bash for Loop over Strings:
Давайте посмотрим на следующий пример, где он будет перебирать номера, начиная с:
Хотя цикл for можно использовать для чисел и строк, программисты могут даже использовать его для повторения в диапазоне. Например:
Операторы break и continue могут использоваться для управления выполнением цикла for.
Заявление о перерыве
Чтобы использовать оператор break, пользователи должны указать конкретное условие, при выполнении которого цикл будет прерван. Программисты могут даже использовать оператор break, если они хотят остановить цикл for раньше запланированного:
Продолжить заявление
Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла. Например, позвольте нам использовать оператор continue для итерации по диапазону чисел, и когда он достигнет определенного числа, которое в данном случае будет ‘6’, оператор continue выйдет из итерации и вернется к началу цикл, чтобы начать следующую итерацию:
Bash для примеров циклов
Цикл для чтения входной переменной
Вот пример того, как вы можете использовать их для цикла. В этом примере мы возьмем входное значение текста, содержащего несколько слов, которые будут взяты после выполнения скрипта. Мы будем использовать цикл for, чтобы разделить предопределенный текст на основе пробелов. Затем убедитесь, что сценарий печатает каждое слово:
Затем запустите следующий скрипт:
Цикл с оператором перерыва
Программисты могут использовать оператор цикла for для чтения и печати списка файлов и папок текущего каталога. Сначала создайте имя файла и выполните следующий сценарий. Пользователи должны помнить, что «*» используется для чтения файлов в цикле for. Функционирование цикла — это простой способ: каждый файл или папка читается на каждом этапе каталога и выводится на печать с выводом в терминал с пробелом «табуляция»:
Затем запустите следующий сценарий:
Изменение расширения файла
unixforum.org
Форум для пользователей UNIX-подобных систем
Сообщение Bsa » 09.12.2005 12:03
эти устройства создаются, но после перезагрузки они исчезают и их надо создавать заново.
Можно ли сделать так, чтобы их создать один раз и навсегда?
Сообщение The Ripper » 09.12.2005 12:18
эти устройства создаются, но после перезагрузки они исчезают и их надо создавать заново.
Можно ли сделать так, чтобы их создать один раз и навсегда?
Сообщение Bsa » 09.12.2005 15:40
Сообщение t.t » 09.12.2005 15:42
Сообщение oxd » 09.12.2005 17:11
Сообщение Bsa » 09.12.2005 22:09
А нет ли каких-нибудь стандартных средств?
Сообщение t.t » 10.12.2005 09:23
Сообщение oxd » 10.12.2005 09:30
А что может быть стандартнее bash?
В общем нада инфы побольше: какое ядро? создается ли автоматом девайсина через fstab (см. выше t.t)
Сообщение Bsa » 11.12.2005 16:04
Но просто интересно, все вставляют скрипт в такой ситуации, или есть иное решение?
Bash-скрипты, часть 2: циклы
Внимание: в посте спрятана выгода!
Циклы for
Перебор простых значений
Пожалуй, самый простой пример цикла for в bash-скриптах — это перебор списка простых значений:
Простой цикл for
Перебор сложных значений
Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.
Перебор сложных значений
TNW-CUS-FMP — промо-код на 10% скидку на наши услуги, доступен для активации в течение 7 дней»
Инициализация цикла списком, полученным из результатов работы команды
Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.
Цикл, который перебирает содержимое файла
Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.
Что, если это совсем не то, что нужно?
Разделители полей
Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:
После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
Если этот скрипт запустить, он выведет именно то, что от него требуется, давая, в каждой итерации цикла, доступ к очередной строке, записанной в файл.
Построчный обход содержимого файла в цикле for
Обход файлов, содержащихся в директории
Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.
Например, вот как можно вывести список файлов и папок:
Вот что выведет скрипт.
Вывод содержимого папки
Обратите внимание на то, как мы инициализируем цикл, а именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.
Циклы for в стиле C
Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:
На bash это можно написать так:
А вот рабочий пример:
Этот код выведет список чисел от 1 до 10.
Работа цикла в стиле C
Цикл while
Вот схема организации циклов while
while команда проверки условия
do
другие команды
done
Взглянем на пример скрипта с таким циклом:
Результат работы цикла while
Вложенные циклы
В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:
Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять — внутренний.
Вложенные циклы
Обработка содержимого файла
Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd :
В этом скрипте два цикла. Первый проходится по строкам, используя в качестве разделителя знак перевода строки. Внутренний занят разбором строк, поля которых разделены двоеточиями.
Обработка данных файла
Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.
Управление циклами
Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:
Команда break
Досрочный выход из цикла for
Вот — то же самое, но уже для цикла while :
Команда continue
Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for :
Команда continue в цикле for
Обработка вывода, выполняемого в цикле
Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:
Перенаправление вывода цикла в файл
Пример: поиск исполняемых файлов
Поиск исполняемых файлов в папках из переменной PATH
Итоги
Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.
Если предположить, что вы — разработчик bash-скриптов, который знает о них только то, что изложено в первой части этого цикла статей, и в этой, второй, то вы уже вполне можете написать кое-что полезное. Впереди — третья часть, разобравшись с которой, вы узнаете, как передавать bash-скриптам параметры и ключи командной строки, и что с этим всем делать.
Уважаемые читатели! В комментариях к предыдущему материалу вы рассказали нам много интересного. Уверены, всё это окажет неоценимую помощь тем, кто хочет научиться программировать для bash. Но тема эта огромна, поэтому снова просим знатоков поделиться опытом, а новичков — впечатлениями.