Основы взаимодействия с ОС

В рамках данной лабораторной работы предлагается получить опыт работы с широким классом «команднострочных» программ — на примере включенных в варианты системы GNU/Linux, в частности — Debian GNU/Linux. Предполагается, однако, что задания будут большей частью выполнимы в рамках любой системы, реализующей стандарт IEEE Std 1003.1-2017 (POSIX.1-2017) — при условии, возможно, установки на такую систему соответствующих дополнительных программ.

Номинальный вклад этой работы в оценку — 25 единиц.

Стандартный ввод-вывод

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

    • alias
    • apg
    • arch
    • ascii
    • atq
    • cal
    • calendar
    • date
    • ddate
    • df
    • dir
    • du
    • echo
    • eval
    • export
    • faillog
    • false
    • fc-cat
    • fc-list
    • filan
    • find
    • findmnt
    • free
    • from
    • groups
    • help
    • history
    • hostid
    • hostname
    • id
    • /sbin/ifconfig
    • infocmp
    • ip link
    • ip address
    • ip addrlabel
    • ip route
    • ip rule
    • ip neigh
    • ip ntable
    • ip tunnel
    • ip tuntap
    • ip maddress
    • ip mroute
    • ip mrule
    • ip netns
    • ip tcp_metrics
    • ip token
    • ip netconf
    • ip vrf
    • ip sr
    • ipcs
    • jobs
    • last
    • lastb
    • lastlog
    • locale
    • logname
    • ls
    • lsattr
    • lsblk
    • lscpu
    • lsipc
    • lslocks
    • lslogins
    • lsmem
    • lsns
    • lsof
    • manpath
    • mcd
    • mcheck
    • mcookie
    • mdir
    • mesg
    • mlabel
    • mount
    • mtoolstest
    • ncal
    • netstat
    • nproc
    • panoinfo
    • pg_isready
    • pg_lsclusters
    • pinky
    • printenv
    • prlimit
    • procan
    • ps
    • pstree
    • pwd
    • readonly
    • resize
    • revpath
    • rpcinfo
    • set
    • shopt
    • showrgb
    • slabtop
    • sselp
    • stty
    • sync
    • time
    • times
    • toe
    • trap
    • tree
    • true
    • tty
    • type
    • typeset
    • ulimit
    • umask
    • uname
    • uptime
    • users
    • uuidgen
    • validateconf
    • vdir
    • vmstat
    • w
    • which
    • who
    • whoami
    • wmname
    • xdpyinfo
    • xdriinfo
    • xfsinfo
    • xgamma
    • xhost
    • xlsatoms
    • xlsclients
    • xlsfonts
    • xrandr
    • xrefresh
    • xvinfo

    Обратите внимание, что справочную информацию по большинству из этих команд можно получить (в случае системы Debian GNU/Linux) используя http://manpages.debian.org/.

    1. (1 ед.) Выполните какие-либо команды-источники. Сверившись, при необходимости, с документацией, объясните вывод трех успешно завершившихся из них. (Обратите внимание, что не все команды могут быть доступны на конкретной системе, или иметь смысл в конкретном контексте.)

      Пример: выполнение команды ps на Debian GNU/Linux.
      $ ps 
        PID TTY          TIME CMD
      12011 pts/7    00:00:00 ps
      32600 pts/7    00:00:08 -bash
      $ 
      
      Пример: выполнение команды ps на NetBSD.
      $ ps 
        PID TTY    STAT    TIME COMMAND
      10428 pts/13 Ss   0:00.07 -bash 
      17253 pts/13 O+   0:00.00 ps 
      $ 
      
    2. (1 ед.) Передавая выбранным командам аргументы командной строки, добейтесь предсказуемого изменения их вывода.

      Пример: выполнение команды ps с измененным набором выводимых полей.
      $ ps -o pid,lstart,args 
        PID                  STARTED COMMAND
      12063 Tue Apr  7 19:20:25 2020 ps -o pid,lstart,args
      32600 Tue Dec  3 04:57:32 2019 -bash
      $ 
      
  2. Далее рассмотрим команды-фильтры, получающие данные со стандартного ввода, определенным образом преобразующие их, и выводящие результат на стандартный вывод. В системе GNU/Linux обычно доступны по меньшей мере следующие такие команды.

    • base32
    • base64
    • cat
    • cksum
    • col
    • colcrt
    • colrm
    • column
    • fmt
    • fold
    • hexdump
    • nl
    • od
    • rev
    • sha224sum
    • sha256sum
    • sha384sum
    • sha512sum
    • shuf
    • sort
    • tac
    • wc

    Обратите внимание, что ввод с клавиатуры по-умолчанию завершается вводом C-d — как это задается настройками терминала (tty-устройства системы.) Cf., e. g., (coreutils)stty invocation.

    1. (1 ед.) Изучите работу каких-либо команд-фильтров. Сверившись, при необходимости, с документацией, опишите преобразования, выполняемые тремя из них.

      Пример: декодирование данных Base64 фильтром base64.
      $ base64 -d 
      SGVsbG8sIHdvcmxkIQo=
      ^D
      Hello, world!
      $ 
      
    2. (2 ед.) Сформируйте из команд-источников и команд-фильтров три нетривиальных конвейера (вида: источник | фильтр) и опишите их работу. При необходимости используйте аргументы командной строки.

      Пример: выполнение команды ps с выделением концов строк символом $ фильтром cat.
      $ ps | cat -E 
        PID TTY          TIME CMD$
      12011 pts/7    00:00:00 ps$
      32600 pts/7    00:00:08 -bash$
      $ 
      
  3. (2 ед.) Ознакомьтесь с документацией на программы постраничного просмотра less, more и most. Сформируйтеe два конвейера вида источник | просмотрщик и два конвейера вида источник | фильтр | просмотрщик. Добавьте к команде просмотрщика какой-либо из найденных в документации аргументов («ключей») командной строки. Объясните результирующие изменения в поведении программы — или же отсутствие таковых.

    Пример: выполнение команды cal с выделением особых символом просмотрщиком less.
    $ cal | less -U 
         April 2020
    Su Mo Tu We Th Fr Sa
              1  2  3  4
     5  6 _^H _^H7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30
    
    (END)
    

Локаль

Изучите вывод команды locale.

  1. (1 ед.) Установив переменную окружения LC_MESSAGES, LC_NUMERIC или LC_TIME в некоторое новое (осмысленное) значение удостоверьтесь, что поведение двух команд-источников изменилось соответственно новому значению переменной.

    Некоторое представление о допустимых значениях может дать статья List of ISO 639-1 codes англоязычной Википедии и, в случае GNU/Linux, вывод команды ls -- /usr/lib/locale.

    Обратите внимание, что значение переменной LC_ALL имеет преимущество перед всеми прочими переменными локали. При наличии переменной LC_ALL в окружении ее имеет смысл удалить (export -n, или же unset.)

    Пример: выполнение команды cal с использованием чешской чешской (sic) локали.
    $ export LC_TIME=cs_CZ.utf8 
    $ cal 
         Dubna 2020       
    Ne Po Út St Čt Pá So  
              1  2  3  4  
     5  6  7  8  9 10 11  
    12 13 14 15 16 17 18  
    19 20 21 22 23 24 25  
    26 27 28 29 30        
                          
    $ 
    
  2. (1 ед.) Подавите локализацию установив LC_ALL=C. Проверьте, что какая-либо из прежде локализованных команд-источников формирует вывод строго в кодировке ASCII. Удалив переменную из окружения удостоверьтесь, что локализация восстановлена.

  3. (2 ед.) Измените значение категории LC_CTYPE. Продемонстрируйте соответствующее изменение поведения какой-либо программы.

Файловая система

В зависимости от контекста, под файловой системой понимают или совокупность всех файловых объектов («файлов»), доступных конкретному процессу в конкретный момент времени; или же конкретный способ организации данных, позволяющий интерпретировать эти данные как набор файлов («тип файловой системы»; например: Btrfs, Ext2, FAT, SquashFS, etc.); или же реализацию этого способа на конкретном носителе. В данном разделе мы рассмотрим работу файловой системы в первом смысле.

  1. (1 ед.) Выполните три командных строки вида источник > файл && фильтр < файл. Поясните, в чем отличие от использования конвейера.

  2. (1 ед.) Многие из команд-фильтров допускают указание аргументом командной строки имени файла; в этом случае, источником данных для обработки становится указанный файл (вместо стандартного ввода.) Продемонстрируйте работу двух из ранее изученных фильров в таком режиме.

    Пример: использование фильтра cat для выделения концов строк файла /etc/issue.net символом $.
    $ cat -E -- /etc/issue.net 
    Debian GNU/Linux 10$
    $ 
    
  3. Стандарт IEEE Std 1003.1-2017 (POSIX.1-2017) предполагает иерархическую организацию файловой системы: файлы особого типа — директории — содержат записи, связывающие имена файлов с собственно файлами — включая другие (вложенные) директории. Директорию, являющуюся корнем результирующего дерева, называют корневой.

    Изучите следующие команды.

    • cd
    • mkdir
    • pwd
    • rmdir
    • touch
    • tree
    1. (1 ед.) Создайте пять новых директорий, сформировав из них дерево глубиной 3. Отобразите его командой tree.

      Пример: создание дерева директорий и его отображение командой tree.
      $ mkdir -p -- donald/huey/dewey/louie donald/mickey
      $ tree -- donald 
      donald
      ├── huey
      │   └── dewey
      │       └── louie
      └── mickey
      
      4 directories
      $ 
      
    2. (1 ед.) Создайте где-либо в дереве новые пустые обычные файлы с именами .utwo (например: touch -- директория/.utwo) и kones. Сравните вывод команд tree -F и tree -a для данного дерева.

  4. Еще одним типом файлов (помимо обычных и директорий) являются файлы устройств.

    Изучите функции следующих файлов директории /dev.

    • full
    • null
    • random
    • tty
    • urandom
    • zero
    1. (1 ед.) Прочитайте 64 байта из каких-либо двух файлов выше. (Например, командой od -N64 или hexdump -n64.) Объясните результат.

    2. (1 ед.) Попробуйте записать какую-либо строку в два файла выше. Объясните результат.

  5. В Unix-подобных системах, один (обычный) файл как правило может иметь несколько имен (или даже, в некоторых случаях, не иметь имен вовсе.) В пределах одной файловой системы (в смысле конкретной реализации способа организации файловых объектов), может быть создано несколько равноценных таких имен. Кроме того, вне зависимости от расположения, на заданные имена файлов (включая несуществующие) могут быть созданы символьные ссылки.

    Изучите следующие команды.

    • link
    • ln
    • mv
    • readlink
    • rm
    • stat
    • unlink
    1. (1 ед.) Создайте новый обычный файл и, используя ln (или link), создайте ему еще одно имя. Удостоверьтесь в равноценности имен записав данные используя одно имя и считав используя другое.

      Пример: создание файла с двумя именами и проверка их равноценности.
      $ touch -- firstname 
      $ ln -- firstname secondname 
      $ date > secondname 
      $ cat < firstname 
      Wed Apr 15 03:37:29 UTC 2020
      $ 
      
    2. (1 ед.) Создайте символьную ссылку (ln -s) на некоторый существующий файл. Переименовав файл, покажите неравноценность исходного имени и ссылки.

    3. (1 ед.) Сравните поведение ln и ln -s в отношении файла, находящегося на другой файловой системе (например, /etc/passwd или /proc/mounts.)

GNU Readline

Реализация интерфейса командной строки в различных программах связана с решением ряда типовых задач: поддержки команд перемещения курсора, удаления и вставки, дополнения (англ. completion), ведения истории введенных команд, etc. Для решения этих задач существует ряд готовых библиотек, одной из которых является GNU Readline.

В числе прочих, на основе этой библиотеки реализованы пользовательские интерфейсы командного интерпретатора (оболочки) GNU Bash, отладчика GDB, etc.

Пример: выявление использующих GNU Readline пакетов командой apt-cache rdepends.
bash$ apt-cache rdepends --no-{suggests,recommends} \
          -- libreadline7 \
          | grep -F -- " " | sort -s | fmt -w65 | less -UF 
  4store abiword abook acl2 aeolus afterstep altos amanda-client
  amiga-fdisk-cross amule-daemon amule-utils apachetop apcalc
  argus-client asymptote atftp augeas-tools avrdude axiom

  1. (1 ед.) Bash реализует встроенную команду bind, позволяющую менять некоторые из настроек GNU Readline, в первую очередь — клавиатурные комбинации («горячие клавиши»; англ. key bindings), используемые данной библиотекой.

    Получите список текущих клавиатурных комбинаций используя bind -p. Объясните действие каких-либо трех строк вывода.

    Пример: получение списка клавиатурных комбинаций Bash (Readline.)
    bash$ bind -p | less 
    "\C-g": abort
    "\C-x\C-g": abort
    "\e\C-g": abort
    "\C-j": accept-line
    "\C-m": accept-line
    # alias-expand-line (not bound)
    
    
  2. (1 ед.) Добавьте какую-либо новую клавиатурную комбинацию к настройкам Readline в сеансе Bash. Опишите, как изменилось поведение командного интерпретатора.

    Обратите внимание, что изменения, внесенные командой bind, распространяются только на тот сеанс Bash, в котором они сделаны.

    Пример: настройка C-b в качестве комбинации для выполнения командной строки (как альтернативы RET.)
    bash$ bind \\C-b:accept-line 
    bash$ date C-b
    Tue Apr 14 18:47:13 UTC 2020
    bash$ 
    
  3. (1 ед.) Внесите какую-либо клавиатурную комбинацию в файл .inputrc домашней директории. Запустив какие-либо две различные программы (bash, gdb, rlwrap, etc.), удостоверьтесь в том, что добавленная комбинация работает в них как должна.

    Пример файла ~/.inputrc.
    "\C-b": accept-line
    
  4. (1 ед.) Некоторые из программ, так же реализующих команднострочный интерфейс, тем не менее не используют Readline, и как следствие нередко лишены функций редактирования (помимо предоставляемых ядром как часть интерфейса терминала.) Добавить такие функции к произвольной программе (с некоторыми оговорками) позволяет rlwrap.

    Выполните какую-либо программу (например — фильтр; или же какой-либо интерпретатор, например tclsh) под rlwrap. Удостоверьтесь в том, что клавиши редактирования и обращения к истории доступны только при использовании rlwrap.

    Пример: выполнение фильтра cat под rlwrap.
    $ rlwrap -c -- cat 
    hello
    hello
    ^D
    $ 
    

Доступ к документации

Документация в Debian GNU/Linux представлена гипертекстовыми материалами формата GNU Info, страницами руководства Unix («man» — в формате на основе roff), и сопроводительными материалами вне этих двух категорий — файлами истории изменений (changelog), HTML, PDF, etc. Кроме того, копию документации можно найти во Всемирной паутине — http://manpages.debian.org/, http://packages.debian.org/, http://gnu.org/, etc.

  1. (1 ед.) Используя команду man, ознакомьтесь с содержанием man-страниц трех из использованных ранее команд.

    Обратите внимание, что man-страницы, включенные в Debian, так же доступны через интерфейс Всемирной паутины, http://manpages.debian.org/.

  2. (1 ед.) Для поиска в базе данных man-страниц системы можно использовать команду apropos.

    Подберите аргументы команды apropos так, чтобы результат запроса включал ровно 7 ÷ 11 результатов.

    Пример: следующий поиск по ключевому слову green в базе данных man-страниц вернул шесть результатов.
    $ apropos -- green | nl -ba 
         1	d.rgb (1grass)       - Displays three user-specified raster maps as red, green
         2	i.his.rgb (1grass)   - Transforms raster maps from HIS (Hue-Intensity-Saturation)
         3	i.rgb.his (1grass)   - Transforms raster maps from RGB (Red-Green-Blue) color
         4	r.composite (1grass) - Combines red, green and blue raster maps into a single
         5	r.his (1grass)       - Generates red, green and blue (RGB) raster map layers
         6	r.rgb (1grass)       - Splits a raster map into red, green and blue maps.
    $ 
    
  3. (2 ед.) Найдите описание двух из использованных ранее команд в системе GNU Info.

    Обратите внимание, что поскольку система Info предложена проектом GNU, и применяется главным образом им же, соответствующие документы зачастую можно найти (в форматах HTML и PDF) на http://gnu.org/.

  4. (1 ед.) Изучите файл changelog.Debian.gz (или changelog.Debian) для какого-либо из пакетов. Дайте комментарии к какой-либо записи этого файла.

    Обратите внимание, что копии этих файлов публикуются во Всемирной паутине и доступны по ссылке со страницы пакета на http://packages.debian.org/.