Это должен знать каждый :) Постараюсь в 2-х словах на пальцах галопом по европам объяснить, чем Linux отличается от Windows с точки зрения организации ПО. В Windows Вы наверное привыкли ставить программы-монстры, делающие сразу все. Надо записать диск - ставим Nero, которая и пишет, и музыку конвертирует, а последние версии еще и архивируют и разделяют на несколько дисков. И такое всюду. В итоге имеем программы хватающиеся сразу за все, и в итоге не делающие толком ничего. Я, конечно, утрирую, но все таки. Это и есть Windows-way. А вот когда нам необходимо сделать чтото хорошо мы ставим какуюто маленькую утилитку, которая справляется со своей задачей идеально. Так вот, Linux целиком и полностью состоит из таких маленьких утилит, делающих что-то одно, но делающих хорошо. Еще эти утилиты умеют «общаться» и передавать друг-другу данные через стандартные потоки stdin и stdout (ну некоторые еще и в stderr успевают писать :). Это и есть Unix-way.

  

Вот тот же пример с архивированием на диск. В Windows: ставим Nero или нечто подобное и выполняем все задачи в ней. Если что-то не устраивает - ищите альтернативу. В Linux мы сначала объединяем все файлы в 1 файл (программой tar), архивируем (используя gzip, bzip2, z7 - кому что по душе), потом разделяем архив на несколько частей (программа split), потом делаем из всего этого iso-файлы (используем mkiso) и наконец записываем на диски с помощью cdrecord. Страшно? Всем сначала страшно. Потому, что кажется, что делать все придется вручную. Но я уже говорил, что программы в Linux умеют общаться между собой? Говорил. Всю эту операцию можно выполнить следующим заклинанием в терминале:
// далее 1 строка
$ tar -cf backup.tar to_backup/*
&& bzip2 -z -9 backup.tar
&& mkisofs -joliet-long backup.tar.bz2 > backup.iso
&& cdrecord dev=/dev/cdrw backup.iso


Кхм... ну вобщем на первый взгляд это выглядит тарабарщиной, но я сейчас все объясню :)

Для начала знайте && означает "если то, что слева выполнилось без ошибок, то выполнить то, что справа". Теперь рассмотрим каждую команду в отдельности:
tar -cf backup.tar to_backup/* - здесь используется программа tar. она умеет объединять несколько файлов в один с сохранением путей и прочих атрибутов. Больше она ничего не умеет (ну это вкратце. На самом деле умеет до фига). Синтаксис у нее такой
tar -cf [общий файл] [файлы]
c означает "создание архива", а f - "выводить в файл, указанный через пробел". В нашем случае это backup.tar. После этого, в текущем каталоге у нас появляется файл backup.tar. Как видите ничего сложного, c и f - это ключи, указывающие программе что и как делать. После ключей могут следовать параметры. вот f - ключ, а backup.tar - параметр этого ключа. Ключи обычно начинаются со знака "минус".

Файл backup.tar мы архивируем при помощи архиватора bzip2, который запущен с ключами -z - архивировать и -9 - на максимальном уровне сжатия. И наш backup.tar превращается в backup.tar.bz2
Который мы успешно записываем в файл backup.iso при помощи mkisofs. Это файл, содержащий кроме данных файловую систему iso, в которой хранится информация на компакт-дисках. Тут стоит рассмотреть подробнее вот какой момент. Мы выполнили команду
mkisofs -joliet-long backup.tar.bz2 > backup.iso. Ну с -joliet-long все должно быть ясно - это обычный параметр указывающий mkisofs создавать файловую систему с использованием joliet расширения, позволяющего хранить файлы с именами длиной до 127 символов. Но полученный файл программа mkisofs выдаст на стандартный поток выхода stdout. По умолчанию stdout выводится на терминал. Не слишком приятно увидеть мелькание содержимого 600-мегабайтного файла, не так ли? :) Поэтому мы перенаправляем наш stdout в файл:
mkisofs -joliet-long backup.tar.bz2 > backup.iso. При помощи > весь stdout (в случае mkisofs это .iso-файл) отправился в backup.iso.

cdrecord dev=/dev/cdrw backup.iso> - записали файл на диск. Это обычный синтаксис утилиты cdrecord.

В общем сначала кажется что все это ненужно, и гораздо проще легче и вообще правильней щелкнуть 30 раз мышкой, продвигаясь по диалогам Nero. Но это кажется только на первый взгляд. Стоит чуточку усложнить задачу, и Nero уже не справится. Вообразим что каталог to_backup из предыдущего примера - это что-то часто обновляемое и достаточно важное, поэтому необходимо записывать архивы на диск каждый день. Если использовать Nero, то рука щелкать устанет :). А в Linux есть программа cron, которая позволяет запускать другие программы по графику. Настроив ее на выполнение этого заклинания каждый день, нам необходимо будет только раз в день доставать записанную болванку, и вставлять новую. Вот она где сила.

Вы наверняка подумали, что запомнить все параметры всех команд - невозможно. Да, невозможно. Но это и не нужно. C каждой программой поставляется документация, из которой можно узнать все необходимое. Вот например мне нужно знать какие ключи имеет команда df, показывающая сколько места осталось на винте. Я введу
$ df --help
и получу краткую справку. Если мне этого недостаточно, я воспользуюсь более подробным мануалом, который мне предоставит команда man:
$ man df
А если и это не спасет, полезу в интернет и узнаю там. И уж в последнюю очередь позвоню знакомому Linux-гуру и спрошу у него (и его ответ будет - "погугли":)

Думаю Вы уже поняли, что именно наличие тысяч маленьких программ, умеющих взаимодействовать между собой, и делает Linux таким гибким. Это напоминает конструктор лего: из набора универсальных кирпичиков можно соорудить и робота, и машинку, и самолет, и дом кирпичный, и ракету и аэростат. А из покупной машинки такого не сделаешь.

Вот еще пример. Вам нужно знать, сколько строк в таком-то файле. Ну так в чем проблема? Открываем в любом редакторе и там смотрим! Хорошо, справились. А если файлов 100?. В Windows задача уже не тривиальна, а в Linux? Нет ничего проше!
$ cat файл | wc -l
И получим количество строк в файле. Как видите, здесь используется вертикальная черта "|", называемая конвейером. конвейер stdout того, что слева, отправляет в stdin того что справа. Команда cat читает файл в stdout, конвейер переводит это на вход (т.е. в stdin) команде wc, которая считает количество строк (ключ -l) и результат выводит в stdout, т.е. на экран. С несколькими файлами немного сложнее, но суть таже. Кому интересно - man xargs :)

Вообщето я хотел написать о кое-каких полезных утилитах, но что-то введение выросло в целую статью :). Ну значит в другой раз...

P.S. Кстати вот высказывание на форуме по поводу Linux vs Windows. Оригинал утерян, но постараюсь передать мысль: "Все люди разные. Бывают супер спринтеры, а бывают и с ограниченными возможностями (без ног, например). Чтобы инвалид хоть как-то мог ходить ему делают костыли. Но на дистанции у спринтера ему никогда не выиграть, чего бы там не говорили производители костылей. А нормальному человеку протезы ни к чему - они ему только мешают. Однажды я это понял, и выкинул костыли от Майкрософт со своего десктопа."

Спасибо Алексею и Павелу Машановым за статью :)