Добавлен: 20.10.2018
Просмотров: 2989
Скачиваний: 23
СОДЕРЖАНИЕ
Ознакомление с рабочим столом ОС Linux и командным интерпретатором BASH
Права доступа к файлам и каталогам
Команды командного интерпретатора BASH и специальные символы
Программные каналы, перенаправление входных и выходных потоков данных
Программа-оболочка Midnight Commander
Мультифайловое программирование
Настройка командного интерпретатора с помощью специальных переменных
$ mv <имя_файла/каталога> <имя_файла/каталога>
Пример 7. Чтобы файлу file1 присвоить имя file5, следует выполнить команду:
$ mv file1 file5
Опции -r- и -i команды mv имеют назначение, как и в команде cp.
Знак "тильда". При выполнении команд, использующих файлы и каталоги, иногда требуется указывать полный путь к файлу или каталогу. Для сокращенной записи используется знак "тильда" (~).
Пример 8. Использование знака "тильда".
$ cp file1 ~/katal1
$ mv file1 ~/katal1
$ mv ../file5
Знак "точка". Каталог, в котором работает пользователь, называется рабочим каталогом. Текущий рабочий каталог можно обозначать знаком "точка" (.).
Пример 9. Пользователь находится в каталоге katal, нужно посмотреть его содержимое. Используется любая из следующих записей: $ ls
или запись: $ ls . Точка здесь означает текущий каталог.
Пример 10. Для копирования из какого-либо каталога в текущий каталог можно использовать знак "точка":
$ cp /home/mykatal/file7 .
Знак "две точки" (..).Переход в родительский каталог обозначается двумя точками "..".
Пример 10. Чтобы не подниматься еще на один уровень вверх, а посмотреть содержимое каталога, в который входит рабочий каталог katal, т.е. содержимое родительского каталога, можно записать: $ ls ..
Пример 11. Из /usr/include/sys произойдет переход в /usr/include, если набрать в командной строке: $ cd ..
Пример 11. Команды просмотра файлов cat и more. Общая структура команд:
$ cat <имя_файла>,
$ more <имя_файла>
Команда more используется для просмотра больших файлов, т.к. дает постраничный просмотр и имеет несколько опций для движения по файлу.
Пример 12. Команду cat можно использовать для просмотра небольших файлов следующим образом:
$ cat имя_файла
Команду cat можно использовать для создания текстовых файлов:
$ cat > имя_файла
Например: $ cat > file1. Далее ввести с клавиатуры текст файла. Набрать Ctrl ^ D одновременно. Файл создан.
Команда rm. Для удаления файлов используется команда rm:
$ rm <список_файлов>
Можно удалять один или несколько файлов, при записи разделенных пробелами. Количество имен файлов можно указать любое.
При использовании опции -i появляется сообщение о подтверждении удаления, нужно указать "да" или "нет" (обычно yes или no).
Для удаления подкаталогов используется опция -r , а чтобы стереть все файлы в текущем каталоге вместо имен файлов можно указать знак *:
$ rm *
Проверить команду Что за команда? (это календарь call).
$ whatis call
Найти подкаталог katal в указанном каталоге /home/student:
$ find /home/student type -d katal
Найти файл file1 в указанном каталоге /home/student:
$ find /home/Student type -f file1
Знак вопроса заменяет один произвольный символ, командой find ведется поиск файлов, названия которых начинаются на file, а далее следует ещё один символ названия:
$ find . -name file?
Программные каналы,
перенаправление входных и выходных
потоков данных
Многие команды ОС Linux принимают данные со стандартного ввода или передают на стандартный вывод. По умолчанию в качестве устройства для стандартного ввода используется клавиатура, для стандартного вывода - терминал. Перенаправление стандартного вывода в файл или на устройство обозначается знаком "больше" (>). Стандартный ввод может быть получен не с клавиатуры, а из файла. Оператором перенаправления стандартного ввода является знак "меньше" (<).
Пример 1. Вывести на экран содержимое файла file и записать в новый файл file1 можно, используя перенаправление стандартного ввода-вывода, представляющего байтовый поток. Чтение данных из файла file и запись в fi1le1 в командной строке осуществляются следующим образом:
$ cat < file > file1
То же самое, но только с опцией -i - проверки наличия файла filef:
$ cat < file > -i file1
Поскольку файл уже создан, появится сообщение о наличии файла file1, нужно ответить n, чтобы не изменять уже существующий файл, или y, чтобы записать в него.
Если требуется добавить информацию в файл, т.е. осуществлять запись в него не с начала файла, а в конец уже имеющейся записи в файле, то используется оператор добавления. Допишем в fi1e1 информацию из файла file2:
$ cat file2 >> file1
ОС Linux поддерживает стандартный вывод сообщений об ошибках (2>), отличающийся от стандартного вывода, результат выводится в файл и в зависимости от настроек на экран.
Пример 2. Чтобы сообщения об ошибках выполнения команды cp записать в файл error, нужно выполнить команду:
$ cp fileprog /k1 2> error
Чтобы добавить сообщения об ошибках в файл error, вместо знака (>) предыдущей команды нужно использовать знак добавления (>>):
$ cat fileinfo 2>> error
Ошибка могла возникнуть, если указанные файлы не существуют.
Для передачи результат выполнения команды в другую команду используется символ вертикальной черты | - так называемый программный канал. Другими словами, он передаёт выходные данные команды на вход следующей команды.
Пример 3. Передать в файл filelist список имен файлов текущего каталога, выданный командой ls. Передача данных в данном примере осуществляется по программному каналу: $ ls | cat > filelist.
Программа-оболочка Midnight Commander
Программа Midnight Commander является аналогом операционной оболочки Norton Commander и имеет с ней большое сходство в интерфейсе и функциях. Она выполняет команды менеджера файлов в текстовом режиме и имеет дополнительно удобные средства просмотра файлов и файловых структур и а также удобные свойства. Запуск Midnight Commander осуществляется из окна терминала:
$ mс
Текстовые редакторы
Пользователь может создавать файлы с использованием текстового редактора vi и его расширенной версии vim, а также графических редакторов gvim, gedit, gnotepad+ и других. Все они являются небольшими редакторами, некоторые из них имеют встроенные функции.
При отладке программ, работе с серверными приложениями, когда нет необходимости устанавливать графический режим, широко используются текстовый редактор vi и его расширенный вариант - текстовый редактор vim. Они являются командами и имеются в большинстве командных интерпретаторов, включая BASH. Их можно запустить из командной строки следующим образом:
$ vi и $ vim
Текстовый редактор vi дает возможность выполнить основные команды редактирования и ввода текста, vim - более мощный текстовый редактор, имеющий большое количество команд редактирования.
Эти редакторы используют в основном клавиатуру и имеют два режима работы: командный и режим ввода текста. После запуска редактора появляется рабочее окно, внизу которого находится командная строка. Набрав в ней команду i (input - ввод) или a (add - добавление), можно приступать к вводу текста. Выход из режима ввода осуществляется нажатием клавиши Esc, переход в командный режим можно осуществить, используя знак ":" . Чтобы запомнить промежуточные результаты ввода, в командном режиме необходимо использовать команду w. Выход из редактора осуществляется нажатием ZZ при нажатой клавише Shift, выход с запоминанием результатов редактирования ‑ wq. Чтобы выйти из редактора без запоминания, в случае, если не было редактирования файла перед этим, в командном режиме выполняется команда q, если выполнялось редактирование - команда q!. Возможно использование команды exit.
Продолжением разработки редактора vim является редактор gvim, он работает в графическом режиме и имеет встроенный интерфейс, как у редактора vi, но дополнен строкой с несколькими кнопками меню, расположенными вверху окна, позволяющими выбирать команды редактора с помощью мыши.
Для рабочего стола GNOME основным является графический редактор gedit, обеспечивающий полную поддержку мыши и реализующий основные функции по редактированию файлов; его функциональные возможности шире, чем у предыдущих.
Для редактирования небольших текстовых файлов и создания web-страниц предназначен графический редактор gnotepad+. Он имеет панель инструментов, дающую возможность вставлять некоторые часто используемые элементы языка HTML.
Компилятор gcc
Для отладки и выполнения программ на языке C используется компилятор gcc. Практически все дистрибутивы Linux поставляются вместе с компиляторами языка C и языка C++. На начальном этапе обучения версия компилятора не имеет значения. Если в дистрибутиве есть компилятор gcc, то обычно есть и линковщик.
Создадим отдельным текстовым файлом простейшую программу, пусть ее имя будет prog1.c (расширение писать обязательно), а исходный текст следующий:
#include <stdio.h>
int main (void)
{
printf ("Hello World\n");
}
Чтобы откомпилировать программу, достаточно набрать в командной строке:
$ gcc -o prog1 prog1.c
$
Команда gcc, вводимая в командной строке командного интерпретатора, выполнит компиляцию, и если в программе нет синтаксических ошибок, то компилятор завершит свою работу без каких-либо сообщений и создаст исполняемый модуль prog1.exe в текущем директории: Набрав команду ls, вы обнаружите новый файл с именем prog1. Этот файл содержит исполняемый код программы. Такие файлы называют исполняемыми файлами ('executable files') или бинарниками ('binary files').
Опция -o компилятора gcc указывает на то, каким должно быть имя выходного файла. Выходным файлом может быть не только бинарник. Если не указать опцию -o, то бинарнику, в нашем случае, будет присвоено имя a.out.
Осталось только запустить полученный бинарный файл на выполнение. Для этого набираем в командной строке следующую команду:
$ ./prog1
Hello World
$
Когда мы набираем в командной строке путь к бинарнику, мы сообщаем КИ, что надо выполнить программу. КИ передает бинарник ядру операционной системы, а ядро системы особым способом отдает программу на выполнение процессору. Затем, если программа не была запущена в фоновом режиме, то КИ ждет от ядра сообщения о том, что программа выполнилась. Получив такое сообщение, КИ выдает приглашение на ввод новой команды. Вы можете еще раз набрать ./prog1 и процедура повторится. В нашем случае программа выполняется очень быстро, и новое приглашение командной строки появляется практически сразу.
Мы рассмотрели идеальный случай, когда программа написана без синтаксических ошибок. Попробуем намеренно испортить программу таким образом, чтобы была ошибка. Для этого достаточно убрать точку с запятой в конце строки функции printf():
printf ("Hello World\n")
Теперь, если попытаться откомпилировать программу, то компилятор укажет на то, что он считает неправильным:
$ gcc -o prog1 prog1.c
hello.c: In function 'main':
hello.c:7: error: syntax error before '}' token
$
В первой строке говорится, что в файле prog1.c в теле функции main() что-то произошло. Вторая строка сообщает, что именно произошло: седьмая строка файла hello.c вызвала ошибку (error). Далее идет расшифровка: синтаксическая ошибка перед закрывающейся фигурной скобкой.
Заглянув в файл prog1.c мы обнаружим, что ошибка не в седьмой, а в шестой строке. Дело в том, что компилятор обнаружил неполадки только в седьмой строке, но написал before (до), что означает "смотри перед".
Естественно, пока мы не исправим ошибку, ни о каком бинарнике не может идти и речи. Если мы удалим старый бинарник prog1, оставшийся от прошлой компиляции, то увидим, что компиляция испорченного файла не даст никакого результата. Однако иногда компилятор может лишь "заподозрить" что-то неладное, потенциально опасное для нормального существования программы. Тогда вместо 'error' пишется 'warning' (предупреждение), и бинарник все-таки появляется на свет (если в другом месте нет явных ошибок). Не следует игнорировать предупреждения, за исключением тех случаев, когда вы на 100% знаете, что делаете.
Мультифайловое программирование
Если исходный код сколько-нибудь серьезной программы уместить в одном файле, то такой код станет просто нечитаемым. К тому же если программа компилируется достаточно долго (особенно это относится к языку C++), то после исправления одной ошибки, нужно перекомпилировать весь код.
Поэтому лучше разбросать исходный код по нескольким файлам (осмысленно, по какому-нибудь критерию), и компилировать каждый такой файл отдельно. Как вы вскоре узнаете, это очень даже просто.
Давайте сначала разберемся, как из исходного файла получается бинарник. Исходный файл не сразу превращается в бинарник. После компиляции создается объектный код. Это исполняемый код с некоторыми "вкраплениями", из-за которых объектный код еще не способен к выполнению. Сразу в голову приходит стиральная машина: вы ее только что купили и она стоит у вас дома в коробке. В таком состоянии она стирать не будет, но вы все равно рады, потому что осталось только вытащить из коробки и подключить.
Вернемся к объектному коду. Эти самые "вкрапления" (самое главное среди них - таблица символов) позволяют объектному коду "пристыковываться" к другому объектному коду. Такой фокус делает компоновщик (линковщик) - программа, которая объединяет объектный код, полученный из "разных мест", удаляет все лишнее и создает полноценный бинарник. Этот процесс называется компоновкой или линковкой.
Итак, чтобы откомпилировать мультифайловую программу, надо сначала добыть объектный код из каждого исходного файла в отдельности. Каждый такой код будет представлять собой объектный модуль. Каждый объектный модуль записывается в отдельный объектный файл. Затем объектные модули надо скомпоновать в один бинарник.
В Linux в качестве линковщика используется программа ld, обладающая приличным арсеналом опций. К счастью gcc самостоятельно вызывает компоновщик с нужными опциями, избавляя нас от "ручной" линковки.
Попробуем теперь, вооружившись запасом знаний, написать мультифайловый Hello World. Создадим первый файл с именем main.c:
/* main.c */
int main (void)
{
print_hello ();
}
Теперь создадим еще один файл hello.c со следующим содержимым:
/* hello.c */
#include <stdio.h>
void print_hello (void)
{
printf ("Hello World\n");
}
Здесь функция main() вызывает функцию print_hello(), находящуюся в другом файле. Функция print_hello() выводит на экран заветное приветствие. Теперь нужно получить два объектных файла. Опция -c компилятора gcc заставляет его отказаться от линковки после компиляции. Если не указывать опцию -o, то в имени объектного файла расширение .c будет заменено на .o (обычные объектные файлы имеют расширение .o):
$ gcc -c main.c
$ gcc -c hello.c
$ ls
hello.c hello.o main.c main.o
$
Итак, мы получили два объектных файла. Теперь их надо объединить в один бинарник:
$ gcc -o hello main.o hello.o
$ ls
hello* hello.c hello.o main.c main.o
$ ./hello
Hello World
$
Компилятор увидел, что вместо исходных файлов (с расширением .c) ему подбросили объектные файлы (с расширением .o) и отреагировал согласно ситуации: вызвал линковщик с нужными опциями.
Чтобы понять, что произошло, воспользуемся утилитой nm. Объектные файлы содержат таблицу символов. Утилита nm как раз позволяет посмотреть эту таблицу в читаемом виде. Те, кто пробовал программировать на ассемблере знают, что в исполняемом файле буквально все (функции, переменные) стоит на своей позиции: стоит только вставить или убрать из программы один байт, как программа тут же превратиться в груду мусора из-за смещенных позиций (адресов). У объектных файлов особая роль: они хранят в таблице символов имена некоторых позиций (глобально объявленных функций, например). В процессе линковки происходит стыковка имен и пересчет позиций, что позволяет нескольким объектным файлам объединиться в один бинарник. Если вызвать nm для файла hello.o, то увидим следующую картину:
$ nm hello.o
U printf
00000000 T print_hello
$
О смысловой нагрузке нулей и литер U,T мы будем говорить при изучении библиотек. Сейчас же важным является то, что в объектном файле сохранилась информация об использованных именах. Своя информация есть и в файле main.o: