Отправляет email-рассылки с помощью сервиса Sendsay

Linux: the choice of a GNU generation.

  Все выпуски  

Linux: the choice of a GNU generation. Да прибудет с тобой мощь терминала.


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

Давайте вернёмся к тому, для чего и изобретались компьютеры — возьмём всё возможное от аппаратной части, посмотрим, как всё это работает, и решим несколько задач.

Начнём с простого: определить переменную в командной строке. Это очень удобно при работе с одним и тем же файлом, если вам не хочется каждый раз набирать полный путь к нему. Это довольно таки просто:

var=1

var2=false

var3=''/home/$user/file.txt''

 Все эти объявления корректны, и тип определяется автоматически. Чтобы воспользоваться переменной в командной строке, просто добавьте перед ней значок доллара. Аналогично можно использовать аллиасы для часто используемых команд:

 alias la='ls -a'

alias pa='ps -a'

 Недостаток обоих этих методов в том, что переменные существуют только в пределах одного сеанса терминала. Чтобы они жили и дальше, добавьте их в ~/.bash_aliases, а сами переменные можно сохранить в ~/.bashrc.

Если вам нужен оператор условия, для задания способа получения результата можно использовать выражения if-else:

 if uname -a | grep ''GNU/Linux'' > /dev/null; then echo

''У вас работает Linux''; fi

 Эта команда направляет полученную системную информацию команде grep и отправляет её результат в /dev/null, так что на экран ничего не выводится. Оператор условия if определяет, возвращён ли результат от grep, и если да, выводит указанную текстовую строку. Теперь можно расширить эту команду, добавив выражение else:

 if uname -a | grep ''GNU/Linux'' > /dev/null; then echo ''Вы хороший человек, раз используете Linux''; else echo ''Патрик вас не любит''; fi

 Операторы if можно вкладывать в выражения else, по такой же схеме.

Вы можете спросить: зачем нужны циклы в командной строке? Например, чтобы скопировать строго определённые файлы из одного места в другое на основе одного критерия, который содержится в переменной, постоянно обновляемой другим процессом. Более вероятно бывает, что требуется распаковать большое количество tar-архивов. Для этой цели пригодятся циклы for или while. Воспользуемся первым вариантом, так как нам нужно выполнить все итерации и перейти к другим действиям:

for i in *.tar.gz; do tar xfs ''$i''; done

 Самая хитрая часть этой команды — маска для поиска всех файлов с расширением tar.gz. Затем для каждого соответствующего i распаковывается содержимое архива. Цикл заканчивается после обработки всех файлов, предоставленных командой ls.

Кстати, цикл можно контролировать переменной, изменяемой в другом терминале. Запустите в одном терминале такую команду:

 while(checkVar); do sleep 1; echo ''Wait...''; done

 Она будет ожидать, пока значение переменной checkVar не изменится на false, а до тех пор будет раз в секунду выводить в окно терминала сообщение «Wait...». Если вам когда-нибудь понадобится ввести команду длинной более одной строки, просто наберите \ и нажмите ввод. Слева появится символ >, и вы сможете набирать команду дальше.

Теперь, научившись работать с файлами, пора начать считывать из них и записывать в них данные. Одна из самых важных команд — less. В интернете её советуют использовать так:

 cat ~/MyFile.txt | less

 Не верьте им. Того же самого можно добиться командой:

 less ~/MyFile.txt

 У less много параметров. Например, если у вас ошибки в каких-то строках, передайте команде параметр -N, и она покажет номера этих строк. Если вам нужна дополнительная информация, воспользуйтесь ключом .

Кроме того, можно открывать более одного файла:

 less file1.txt file2.txt

 С помощью :n и можно переключаться между двумя файлами. Если необходимо открыть ещё один файл, не закрывая два уже открытых, наберите и имя файла. Чтобы закрыть текущий файл наберите :d.

Однако самая интересная возможность less — это восклицательный знак !. Наберите его вместе с командой и less исчезнет, будет запущена команда, а затем less появится вновь. Это удобно для решения нескольких задач одновременно, но ещё удобнее, если использовать % для ссылки на текущий файл. Например:

 !ls $home >> %

 И результат выполнения команды ls добавится прямо в файл, который вы просматриваете. При возвращении в less буфер обновится, и вы сможете продолжить работу.

Когда-нибудь простого просмотра текстовых файлов станет вам недостаточно, и вы столкнётесь с необходимостью сравнить содержимое двух файлов. Это особенно удобно для разработчиков, у которых есть несколько рабочих копий исходного кода. Если вы хотите просто вывести различия в окно терминала, выполните:

 diff file2.txt file2.txt

 Это само по себе интересно, но не слишком полезно. А если мы захотим применить различия между двумя файлами к file2? Мы запишем их в файл  а затем залатаем файл с помощью следующих команд:

 diff -u file1.txt file2.txt >> changes.diff

patch changes.diff

 Ключ -u гарантирует, что различия выводятся в стандартном формате diff, а если текстовые файлы находятся в подкаталогах текущего каталога, добавьте к команде patch ключ -R.

Последняя важная утилита, после освоение которой вы превратитесь из новичка в мастера — команда find.

Первое, что нужно уяснить — команда отнюдь не очевидна. Не думайте, что набрав find this, вы увидите результат. К сожалению, у разработчиков были другие планы, и они намеренно усложнили команду, для гарантии, что вы прочли документацию, над которой они проводили бессонные ночи, пренебрегая лишним бокалом пива.

Вот простейший из вариантов этой команды:

 find .

 Впечатляет? Эта маленькая команда выводит список всех файлов в вашем домашнем каталоге. Но мы явно хотим большего, например, найти файлы с определённым именем. Воспользуемся командой:

 find . -name=''* a''

 Эта команда найдёт все файлы в текущем каталоге, имена которых содержат «а». Можно искать файлы и по размеру, используя -size +10k для файлов, размер которых меньше 10Мб. Для поиска файлов определённого владельца воспользуйтесь параметром -user, например, -user ukcap, а для поиска результатов, не соответствующих критерию — параметром -not. Теперь добавим всё это в приведённую ранее команду:

 find . -name=''* tex'' -size +1M -user ukcap

find . -not -name=''* tex'' +1M -nor -user ukcap

 Первая команда находит все файлы, в имени которых содержится tex, с размером больше 1 Мб и владельцем ukcap. Вторая команда найдёт все файлы, в имени которых не содержится tex, с размером больше 1Мб, и владельцем которых не является ukcap.

И, наконец, параметр -newer, благодаря которому мы найдем файлы, более новые по сравнению с заданными. Эта возможность особенно пригодится системным администраторам, желающим узнать, что за файлы создал пользователь в некоем каталоге:

 find . -newer /path/to/file

 С помощью клавиши TAB можно автоматически дополнять команды, но наблюдательные юзеры заметят, что если продолжать нажимать «стрелку вверх», можно увидеть все команды, набранные вчера, позавчера и даже на прошлой неделе. Bash сохраняет все команды, которые вы запускали в прошлом.

Чтобы найти команду, выполненную ранее, воспользуйтесь символом !. Просто наберите его после нескольких символов искомой команды. Например, команду

 mkdir /etc/init.d/random_folder

 можно вызвать снова с помощью

 !mk

 Область поиска можно расширить, не ограничивая её только началом команды, с помощью символов !?, и вызвать предыдущую команду так:

 !?dom

 Как видно, здесь для запуска последней команды мы употребили dom из random.

Хотя этот прём удобен, не стоит выполнять его с разрушительными командами типа rm, так как команда не только находится, но и немедленно выполняется.

Однако, мы не всегда можем предвидеть, что произойдёт при выполнении команд c помощью этих маленьких трюков. Для этого надо углубиться в историю команд Bash. Нажмите ctrl+r — это переведёт Bash в режим поиска по истории команд. По мере набора команды будут появляться наиболее вероятные варианты, пока не возникнет команда, которая вам нужна. Когда это произойдёт, нажмите enter, чтобы немедленно выполнить команду, или esc, чтобы выбрать команду из истории и продолжить её редактирование. Это очень удобно, особенно если вы потратили пару часов на исправление ошибки.

Если вы точно не знаете, какая команда вам нужна, вытяните всю историю команд и затем выполните конкретную команду оттуда. Сначала выведем все команды в памяти с их ID-номерами:

 history | grep -i ''кусок_команды''

 Найдя нужную команду, просто наберите !n. Где n — номер команды в истории.

И напоследок. По выполнении выбранной команды она становится вашей последней командой, а значит и последней командой в истории Bash. Этого не следует забывать, так как попытка выполнить одну и ту же команду из предыстории может привести к очень странным результатам, потому что связанное с ней содержимое будет меняться при каждом запуске.

 

 


В избранное