Какие типы команд существуют в командной оболочке
Перейти к содержимому

Какие типы команд существуют в командной оболочке

  • автор:

Командная оболочка, командная строка и команды Для организации интерфейса пользователя в состав Unix входит командная оболочка, называемая shell. Она выполняет следующие функции:

является интерпретатором развитого командного языка, позволяющего пользователю создавать сложные сценарии выполнения программ.

Существуют различные версии shell, наиболее популярными из них являютсяsh(BourneShell),bash(BourneAgainShell),csh(C-Shell),ksh(KornShell). Мы будем рассматриватьbash, обычно загружаемую ОС по умолчанию.

Командная строкаимеет следующий вид:

$ команда ключи аргументы

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

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

Внутренние команды языка shellпредставляют собой программы, находящиеся в каталоге/usr/bin. Большинство из них имеют следующий формат:

имя_команды ключи аргументы

Ключи служат для модификации режимов работы команды и представляют собой наборы определенных символов, которым предшествует символ «-» (короткие имена ключей) или комбинация «—» (длинные имена ключей). Чаще всего в качестве короткого имени ключа используется начальная буква действия, которое определяется данным ключом, например ключ -u– это сокращение отuser.

Свойство ключа быть, с одной стороны, предельно коротким, а с другой стороны – информативным, называется аббревиативностью. Не только ключи, но и имена наиболее распространенных команд Unix обладают этим свойством. Аббревиативность ключей трудно соблюсти, когда их у команды слишком много. Некоторые буквы латинского алфавита (например, s или o) используются очень часто, и могли бы служить сокращением сразу нескольких команд. На такой случай существует другой, полнословный формат: ключ начинается на два знака «-», за которыми следует полное имя ключа. Таков, например, ключ—wildcards.

А некоторые ключи могут обозначаться как коротким, так и полным именем, например ключ с коротким именем -hимеет аналог с длинным именем—help.

Аргументы команды (или параметры команды) указывают на объекты, над которыми выполняются операции. Аргументами команд в большинстве случаев являются имена файлов. Например, приведенная ниже команда означает: «Выполнить команду ls(отображение информации о файле) с ключом-l(подробная информация) для файла а.out»:

Если необходимо использовать два и более однобуквенных ключа, большинство команд позволяют объединять их. Например, две приведенные ниже команды идентичны:

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

В одной строке может содержаться несколько команд. Они отделяются друг от друга символом «;».

Одну команду можно разместить на нескольких экранных строках. Для этого перед нажатием клавиши [Enter] необходимо поставить символ «\».

Командный процессор shellищет имена команд в указанном наборе каталогов, который можно изменить по желанию пользователя. Список этих каталогов является значением переменной средыPATH.

Получение справки о командах Unix

Получить справку о работе команд Unixможно несколькими способами.

1. Страницы руководства (manpages) содержат больше всего полезной информации. Каждая страница руководства посвящена какому-нибудь одному объекту системы. Для того чтобы посмотреть страницу руководства по какой-либо команде, нужно дать команду

man [номер_раздела] [имя_объекта]

Номера и названия разделов руководства:

Системные вызовы (пользовательские функции ядра Unix; руководства рассчитаны на программиста, знающего язык С).

Библиотечные функции (функции, принадлежащие всевозможным библиотекам подпрограмм; руководства рассчитаны на программиста, знающего язык С).

Внешние устройства и работа с ними.

Форматы различных стандартных файлов системы (например, конфигурационных).

Игры, безделушки и прочие вещи, не имеющие системной ценности.

Теоретические положения, договоренности и все, что не может быть классифицировано.

Инструменты администратора (часто недоступные обычному пользователю).

Интерфейс ядра (внутренние функции и структуры данных ядра Unix, необходимые только системному программисту, исправляющему или дополняющему ядро).

Например, если нужно просмотреть справку о работе команды find, необходимо выполнить команду

Как правило, команда manсама находит раздел с требуемой справкой, просматривая все разделы по очереди, поэтому для получения справки по командеfind достаточно ввести

Для получения списка разделов, в которых встречается требуемый термин используется ключ -l.

Страница руководства занимает, как правило, больше одной страницы экрана. Страницы перелистываются вниз с помощью клавиши пробела или клавиши [Page Down], вверх – с помощью клавиши [Page Up], для сдвига на одну строку вперед можно применять Enter или клавишу [Стрелка вниз], а на одну строку назад – клавишу [Стрелка вверх]. Переход на начало и конец текста выполняется по нажатию клавиш [g] и [G] соответственно (Go). Выход осуществляется по нажатию клавиши [q] (Quit).

[в закладки] Bash для начинающих: 21 полезная команда

Материал, перевод которого мы публикуем сегодня, предназначен для тех, кто хочет освоить командную строку Linux. Умение эффективно пользоваться этим инструментом позволяет экономить немало времени. В частности, речь здесь пойдёт о командной оболочке Bash и о 21 полезной команде. Также мы поговорим о том, как пользоваться флагами команд и псевдонимами Bash, которые позволяют ускорить ввод длинных инструкций.

Термины

В ходе освоения работы в командной строке Linux вам может встретиться множество понятий, в которых полезно будет ориентироваться. Некоторые из них, вроде «Linux» и «Unix», или «командная оболочка» и «терминал», иногда путают. Поговорим об этих и о других важных терминах.

Unix — это популярная операционная система, которая была разработана Bell Labs в 1970-х. Её код был закрытым.

Linux — это самая популярная Unix-подобная операционная система. Она в наши дни используется на множестве устройств, в том числе — и на компьютерах.

Терминал (terminal), или эмулятор терминала — это программа, дающая доступ к операционной системе. Одновременно можно открывать несколько окон терминала.

Оболочка (shell) — это программа, которая позволяет отправлять операционной системе команды, написанные на особом языке.

Bash расшифровывается как Bourne Again SHell. Это — самый распространённый язык командной оболочки, используемый для взаимодействия с операционной системой. Кроме того, оболочка Bash по умолчанию используется в macOS.

Интерфейс командной строки (Command Line Interface, CLI) — это способ взаимодействия человека и компьютера, при использовании которого пользователь вводит команды с клавиатуры, а компьютер, выполняя эти команды, выводит, в текстовом виде, сообщения для пользователя. В основном CLI используется для получения свежей информации о неких сущностях, например, о файлах, и для работы с файлами. Интерфейс командной строки следует отличать от графического пользовательского интерфейса (Graphical User Interface, GUI), при работе с которым, в основном, используется мышь. Интерфейс командной строки часто называют просто командной строкой.

Скрипт (script) — это небольшая программа, которая содержит последовательность команд командной оболочки. Скрипты записывают в файлы, использовать их можно многократно. При написании скриптов можно пользоваться переменными, условными конструкциями, циклами, функциями и другими возможностями.

Теперь, когда мы рассмотрели важные термины, хочу отметить, что здесь я буду пользоваться терминами «Bash», «оболочка» и «командная строка» как взаимозаменяемыми, равно как и понятиями «директория» (directory) и «папка» (folder).

Стандартные потоки, которыми мы будем здесь пользоваться — это стандартный ввод (standard input, stdin ), стандартный вывод (standard output, stdout ) и стандартный вывод ошибок (standard error, stderr ).

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

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

21 Bash-команда

▍Получение информации

  • man : выводит руководство пользователя (справку) по команде.
  • pwd : выводит сведения о рабочей директории.
  • ls : выводит содержимое директории.
  • ps : позволяет просматривать сведения о работающих процессах.

▍Манипуляции с файловой системой

  • cd : изменение рабочей директории.
  • touch : создание файла.
  • mkdir : создание директории.
  • cp : копирование файла.
  • mv : перемещение или удаление файла.
  • ln : создание ссылки.

▍Перенаправление ввода-вывода и конвейеры

  • < : перенаправление stdin .
  • > : перенаправление stdout .
  • | : перенаправление с помощью конвейера вывода одной команды на вход другой команды.

▍Чтение файлов

  • head : чтение начала файла.
  • tail : чтение конца файла.
  • cat : чтение файла и вывод его содержимого на экран или конкатенация файлов.

▍Удаление файлов, остановка процессов

  • rm : удаление файла.
  • kill : остановка процесса.

▍Поиск

  • grep : поиск информации.
  • ag : продвинутая команда для поиска.

▍Архивация

  • tar : создание архивов и работа с ними.

Подробности о командах

Для начала давайте разберёмся с командами, результаты работы которых выдаются в форме stdout . Обычно эти результаты появляются в окне терминала.

▍Получение информации

man command_name : вывод руководства по команде, то есть — справочной информации.

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

ls : вывод содержимого директории. Эта команда тоже используется весьма часто.

ls -a : вывод скрытых файлов. Здесь применён флаг -a команды ls . Использование флагов помогает настраивать поведение команд.

ls -l : вывод подробной информации о файлах.

Обратите внимание на то, что флаги можно комбинировать. Например — так: ls -al .

ps : просмотр выполняющихся процессов.

ps -e : вывод сведений обо всех выполняющихся процессах, а не только о тех, которые связаны с текущей оболочкой пользователя. Данную команду часто используют именно в таком виде.

▍Манипуляции с файловой системой

cd my_directory : изменение рабочей директории на my_directory . Для того чтобы перейти на один уровень выше в дереве каталогов используйте в качестве my_directory относительный путь ../ .

touch my_file : создание файла my_file по заданному пути.

mkdir my_directory : создание папки my_directory по заданному пути.

mv my_file target_directory : перемещение файла my_file в папку target_directory . При указании целевой директории нужно использовать абсолютный путь к ней (а не конструкцию вроде ../ ).

Команду mv , кроме того, можно использовать для переименования файлов или папок. Например, выглядеть это может так:

mv my_old_file_name.jpg my_new_file_name.jpg
cp my_source_file target_directory : создание копии файла my_source_file и помещение её в папку target_directory .

ln -s my_source_file my_target_file : создание символической ссылки my_target_file на файл my_source_file . Если изменить ссылку, то изменится и исходный файл.

Если файл my_source_file будет удалён, то my_target_file останется. Флаг -s команды ln позволяет создавать ссылки и для директорий.

Теперь поговорим о перенаправлении ввода-вывода и конвейерах.

▍Перенаправление ввода-вывода и конвейеры

my_command < my_file : заменяет дескриптор файла стандартного ввода ( stdin ) на файл my_file . Это может оказаться полезным в том случае, если команда ожидает ввода неких данных с клавиатуры, а эти данные заранее сохранены в файле.

my_command > my_file : перенаправляет результаты работы команды, то есть то, что обычно попадает в stdout и выводится на экран, в файл my_file . Если файл my_file не существует — он создаётся. Если файл существует — он перезаписывается.

Например, после выполнения команды ls > my_folder_contents.txt будет создан текстовый файл, содержащий список того, что находится в текущей рабочей директории.

Если вместо символа > воспользоваться конструкцией >> , то, при условии существования файла, в который перенаправляется вывод команды, этот файл перезаписан не будет. Данные будут добавлены в конец этого файла.

Теперь взглянем на конвейерную обработку данных.

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

first_command | second_command : символ конвейера, | , используется для того чтобы отправить результаты работы одной команды другой команде. То, что команда, находящаяся в левой части описываемой конструкции, отправляет в stdout , попадает в stdin команды, которая находится справа от символа конвейера.

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

С помощью символа конвейера можно объединять в цепочку несколько команд. Выглядит это так:

Конвейер из нескольких команд можно сравнить с трубопроводом

Обратите внимание на то, что когда команда, находящаяся слева от символа | , выводит что-то в stdout , то, что она вывела, немедленно становится доступным в виде stdin второй команде. То есть оказывается, что, используя конвейер, мы имеем дело с параллельным выполнением команд. Иногда это может привести к неожиданным результатам. Подробности об этом можно почитать здесь.

Теперь поговорим о чтении данных из файлов и о выводе их на экран.

▍Чтение файлов

head my_file : считывает строки из начала файла и выводит их на экран. Читать можно не только содержимое файлов, но и то, что команды выводят в stdin , используя эту команду в качестве элемента конвейера.

tail my_file : считывает строки из конца файла. Эту команду тоже можно использовать в конвейере.

Head (голова) находится спереди, а tail (хвост) — сзади

Если вы работаете с данными, используя библиотеку pandas, тогда команды head и tail должны быть вам знакомы. Если это не так — взгляните на вышеприведённый рисунок, и вы без труда их запомните.

Рассмотрим другие способы чтения файлов, поговорим о команде cat .

Команда cat либо выводит содержимое файла на экран, либо конкатенирует несколько файлов. Это зависит от того, сколько файлов передано этой команде при вызове.

Команда cat

cat my_one_file.txt : когда этой команде передают один файл — она выводит его в stdout .

Если же передать ей два файла или большее количество файлов, то она ведёт себя по-другому.

cat my_file1.txt my_file2.txt : получив на вход несколько файлов эта команда конкатенирует их содержимое и выведет то, что получилось в stdout .

Если результат конкатенации файлов нужно сохранить в виде нового файла, можно воспользоваться оператором > :

Теперь поговорим о том, как удалять файлы и останавливать процессы.

▍Удаление файлов, остановка процессов

rm my_file : удаляет файл my_file .

rm -r my_folder : удаляет папку my_folder и все содержащиеся в ней файлы и папки. Флаг -r указывает на то, что команда будет работать в рекурсивном режиме.

Для того чтобы система не запрашивала подтверждение при выполнении каждой операции удаления файла или папки, воспользуйтесь флагом -f .

kill 012345 : останавливает указанный выполняющийся процесс, давая ему время на корректное завершение работы.

kill -9 012345 : принудительно завершает указанный запущенный процесс. Флаг вида -s SIGKILL означает то же самое, что и флаг -9 .

▍Поиск

Для поиска данных можно использовать разные команды. В частности — grep , ag и ack . Начнём наше знакомство с этими командами с grep . Это — проверенная временем, надёжная команда, которая, правда, медленнее других и не так, как они, удобна в использовании.

Команда grep

grep my_regex my_file : выполняет поиск my_regex в my_file . При обнаружении совпадений возвращается, для каждого из них, вся строка. По умолчанию my_regex воспринимается как регулярное выражение.

grep -i my_regex my_file : поиск выполняется без учёта регистра символов.

grep -v my_regex my_file : возвращает все строки, в которых не содержится my_regex . Флаг -v означает инверсию, он напоминает оператор NOT , имеющийся во многих языках программирования.

grep -c my_regex my_file : возвращает сведения о количестве совпадений с искомым шаблоном, найденных в файле.

grep -R my_regex my_folder : выполняет рекурсивный поиск во всех файлах, находящихся в заданной папке и в папках, вложенных в неё.

Теперь поговорим о команде ag . Она появилась позже grep , она быстрее, работать с ней удобнее.

ag my_regex my_file : возвращает сведения о номерах строк, и сами строки, в которых найдены совпадения с my_regex .

ag -i my_regex my_file : поиск выполняется без учёта регистра символов.

Команда ag автоматически обрабатывает файл .gitignore и исключает из вывода то, что найдено в папках или файлах, перечисленных в этом файле. Это очень удобно.

ag my_regex my_file — skip-vcs-ignores : содержимое файлов систем автоматического контроля версий (наподобие .gitignore ) при поиске не учитывается.

Кроме того, для того чтобы указать команде ag на то, какие пути к файлам нужно исключить из поиска, можно создать файл .agignore .

В начале этого раздела мы упомянули о команде ack . Команды ack и ag очень похожи, можно сказать, что они взаимозаменяемы на 99%. Однако команда ag работает быстрее, поэтому я описал именно её.

Теперь поговорим о работе с архивами.

▍Архивация

tar my_source_directory : объединяет файлы из папки my_source_directory в один файл tarball. Такие файлы удобно использовать для того, чтобы передавать кому-нибудь большие наборы файлов.

Команда tar

Tarball-файлы, создаваемые этой командой, представляют собой файлы с расширением .tar (Tape ARchive). То, что в названии команды и в расширении имён файлов, создаваемых ей, скрыто слово «tape» (лента), говорит о том, как давно существует эта команда.

tar -cf my_file.tar my_source_directory : создаёт tarball-файл с именем my_file.tar с содержимым папки my_source_directory . Флаг -c расшифровывается как «create» (создание), а флаг -f как «file» (файл).

Для извлечения файлов, находящихся в .tar -файле, используется команда tar c флагами -x («extract», извлечение) и -f («file», файл).

tar -xf my_file.tar : извлекает файлы из my_file.tar в текущую рабочую директорию.

Теперь поговорим о том, как сжимать и распаковывать .tar -файлы.

tar -cfz my_file.tar.gz my_source_directory : здесь, с использованием флага -z («zip», алгоритм сжатия) указано, что для сжатия файлов должен использоваться алгоритм gzip (GNU zip). Сжатие файлов позволяет экономить дисковое пространство при хранении таких файлов. Если же файлы планируется, например, передавать другим пользователям, это способствует более быстрой загрузке таких файлов.

Распаковать файл .tar.gz можно, добавив флаг -z к команде извлечения содержимого .tar -файлов, которую мы рассматривали выше. Выглядит это так:

tar -xfz my_file.tar.gz
Надо отметить, что у команды tar есть ещё множество полезных флагов.

Bash-псевдонимы

Bash-псевдонимы (их ещё называют алиасами или сокращениями) предназначены для создания сокращённых наименований команд или их последовательностей, использование которых вместо обычных команд ускоряет работу. Если у вас, предположим, имеется псевдоним bu , за которым скрывается команда python setup.py sdist bdist_wheel , то для вызова данной команды достаточно воспользоваться этим псевдонимом.

Для создания подобного псевдонима достаточно добавить следующую команду в файл

Если в вашей системе нет файла

/.bash_profile , то вы можете создать его самостоятельно, воспользовавшись командой touch . После создания псевдонима перезапустите терминал, после чего вы сможете этим псевдонимом пользоваться. В данном случае ввод двух символов заменяет ввод более чем трёх десятков символов команды, которая предназначена для сборки Python-пакетов.

/.bash_profile можно добавлять псевдонимы для любых часто используемых команд.

▍Итоги

В этом материале мы рассмотрели 21 популярную команду Bash и поговорили о создании псевдонимов для команд. Если вам эта тема интересна — вот цикл публикаций, посвящённый Bash. Здесь можно найти pdf-версию этих публикаций. Кроме того, если вы хотите освоить Bash, помните о том, что тут, как и при изучении любой другой программной системы, важна практика.

Уважаемые читатели! Какие команды, которые полезно знать начинающим, вы добавили бы к тем, которые были рассмотрены в этой статье?

Какие типы команд существуют в командной оболочке

В операционной системе UNIX основными средствами взаимодействия пользователя с системой являются клавиатура и экран монитора, работающий в текстовом режиме. Вводимый пользователем текст немедленно отображается на мониторе соответствующими знаками, однако может и не отображаться (например, в случае ввода пароля). Для управления вводом используются некоторые нетекстовые клавиши на клавиатуре: Backspace (он же « Забой ») – для удаления последнего введенного символа или Enter – для передачи команды системе. Нажатие на эти клавиши не приводит к отображению символа, вместо этого вводимый текст обрабатывается системой тем или иным способом – эти клавиши и их комбинации объединяют понятием управляющие символы .

Текстовый принцип работы с машиной позволяет отвлечься от конкретных частей компьютера, вроде системной клавиатуры и видеокарты с монитором, рассматривая единое оконечное устройство, посредством которого пользователь вводит текст и передает его системе, а система выводит необходимые пользователю данные и сообщения. Такое устройство называется терминалом . В общем случае терминал – это точка входа пользователя в систему, обладающая способностью передавать текстовую информацию. Терминалом может быть отдельное внешнее устройство, подключаемое к компьютеру через порт последовательной передачи данных (« COM-порт »). В роли терминала может работать (с некоторой поддержкой со стороны системы) и программа (например, xterm или ssh ).

Свойство терминала передавать только символьную информацию приводит к тому, что некоторые из передаваемых символов должны восприниматься не как текстовые, а как управляющие (например, символы, возвращаемые клавишами Backspace и Enter). На самом деле управляющих символов больше: часть из них предназначена для экстренной передачи команд системе, часть – для редактирования вводимого текста. Многие из этих символов не имеют специальной клавиши на клавиатуре, поэтому их необходимо извлекать с помощью клавиатурного модификатора Ctrl . Проблема в том, что на клавиатуре может быть так много разных нетекстовых клавиш, что на них не хватает ограниченного количества разных управляющих символов. Поэтому большинство нетекстовых клавиш возвращают так называемую управляющую последовательность , которая начинается управляющим символом, за которым следует строго определенное число обычных символов.

Одной из полезных особенностей терминала является позможность его « прокрутки » с помощью клавиш Shift + PgUp и Shift + PgDn . Это может быть полезно, если вывод программы занимает больший объём, чем размер экрана.

Командная оболочка

Основная среда взаимодействия с UNIX – командная строка . Суть её в том, что каждая строка, передаваемая пользователем системе, – это команда, которую та должна выполнить. Пока не нажата клавиша Enter , строку можно редактировать, затем она отсылается системе.

Команды интерпретируются и выполняются специальной программой – командной оболочкой (или « shell », по-английски). Через командную оболочку производится управление пользовательскими процессами – для этого используются средства межпроцессного обмена, описанные ранее (см. «Межпроцессное взаимодействие»).

Командная оболочка непосредственно связана с терминалом, через который осуществляется передача управляющих последовательностей и текста. На рисунке Рисунок 2.1, «Интерфейс командной строки» представлена общая схема взаимодействия пользователя с системой при использовании командной строки.

Рисунок 2.1. Интерфейс командной строки

Интерфейс командной строки

Одновременный доступ к системе

То, что UNIX – многопользовательская и многозадачная система, проявляется не только в разграничении прав доступа (см. раздел Глава 3, Безопасность операционной системы UNIX), но и в организации рабочего места. Каждый компьютер, на котором работает UNIX, предоставляет возможность зарегистрироваться и получить доступ к системе нескольким пользователям одновременно. Даже если в распоряжении всех пользователей есть только один монитор и одна системная клавиатура, эта возможность небесполезна: одновременная регистрация в системе нескольких пользователей позволяет работать по очереди без необходимости каждый раз завершать все начатые задачи (закрывать все окна, прерывать исполнение всех программ) и затем возобновлять их. Более того, ничто не препятствует зарегистрироваться в системе несколько раз под одним и тем же входным именем. Таким образом, можно получить доступ к одним и тем же ресурсам (своим файлам) и организовать параллельную работу над несколькими задачами.

Характерный для современных версий UNIX способ организации параллельной работы пользователей – виртуальные консоли . Виртуальные консоли (virtual console) – это несколько параллельно выполняемых операционной системой программ, предоставляющих пользователю возможность зарегистрироваться в системе в текстовом режиме и получить доступ к командной строке (см. Рисунок 2.2, «Виртуальные и графические консоли»).

В операционной системе Linux переключение между виртуальными консолями в текстовом режиме производится с помощью комбинации клавиш Alt + F1 , Alt + F2 и т.п.. При этом каждая виртуальная консоль обозначается специальным именем: « tty1 », « tty2 » и т.д.. По умолчанию в Linux доступно не менее шести виртуальных консолей, переключаться между которыми можно при помощи сочетания клавиши Alt с одной из функциональных клавиш ( F1F6 ). С каждым сочетанием связана соответствующая по номеру виртуальная консоль. Виртуальные консоли обозначаются « ttyN », где « N » – номер виртуальной консоли. На самом деле, каждая из таких конолей связано с собственным терминалом , который характеризуется файлом устройства с соответствующим именем (например, /dev/tty1 ).

Современные версии UNIX предоставляют пользователям графические пользовательские интерфейсы (подробнее графическая подсистема UNIX рассматривается в разделе Глава 7, Графическая подсистема UNIX), которые также дают возможность работы в командной строке. Эта возможность достигается с помощью графических терминалов – специальных программ, которые эмулируют текстовый терминал в графическом окне.

Также существует возможность запуска нескольких графических подсистем, тогда переключение между ними будет осуществляться аналогично переключению между виртуальными консолями – комбинацией клавиш Ctrl + Alt + F1 .

Рисунок 2.2. Виртуальные и графические консоли

Виртуальные и графические консоли

Каждое устройство терминала имеет свои возможности по вводу и выводу информации. Примерати таких возможностей являются: число цветов отображения, способность перемещать курсор и изменять размер экрана, набор управляющих символов и т.п.. Терминалы разделяют по типам : набору возможностей, регламентированных в специальном конфигурационном файле. Примерами типов являются: tty (телетайп) или xterm (графический терминал). Тип терминала явно указан в имени устройства терминала (например, /dev/tty1 ). Все настройки типов терминалов находятся в директории /etc/termcap .

Формат командной строки

Приглашение

Командная строка состоит из приглашения и вводимой команды. Приглашение – это специальная последовательность символов, которая располагается в начале строки и задает начало области ввода команды. Рассмотрим пример выполнения команды:

Пример 2.1. Пример выполнения команды

Здесь приглашением является строка user@desktop

$ , которая помимо символа начала ввода ($) содержит информацию об имени пользователя, имени компьютера и текущей директории.

Формат команды

Каждая команда UNIX состоит из следующих частей:

Идентификатор команды, совпадающий с именем программы, которая запускается для исполнения команды. Некоторые команды (такие как echo ) являются встроенными для данной командной оболочки и для их выполнения вызывается не программа, а внутренняя функция оболочки.

Параметры или ключи или флаги или опции

Команда может иметь один или несколько параметров, разделённых пробелом. Параметры могут быть однобуквенными (как -l ) или полнословными (например, —help ). Однобуквенные параметры могут группироваться, например запуск команды ls -al эквивалентен запуску ls -a -l . Некоторые параметры состоят из имени и аргумента, например в коменде grep -f access.log -n test имя файла access.log – часть параметра -f .

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

Стандартный ввод и вывод каждой команды (см. «Межпроцессное взаимодействие») может быть перенаправлен в файл. По умолчанию ввод и вывод команды связываются с пользовательским терминалом. Для указания источника ввода или назначения вывода (для обычной информации и для ошибок отдельно) используются специальные символы (<, > и >>).

Как правило, порядок данных частей команды должен быть именно таким, однако некоторые из них (кроме имени команды) могут отсутствовать.

Процесс выполнения команды

Командная оболочка – это обычный процесс в операционной системе UNIX. Когда пользователь вводит команду (например, по нажатию Enter ), командная оболочка выполняет следующие действия:

  1. анализ команды: выделение имени, параметров и аргументов;
  2. если это встроенная команда , для неё вызывается функция-обработчик;
  3. если это внешняя команда :
  1. производится поиск программы с соответвующим именем;
  2. создаётся дочерний процесс оболочки (системный вызов fork);
  3. в дочернем процессе запускается необходимая команда с расшифрованными параметрами и аргументами (системный вызов exec);
  4. оболочка контролирует выполнение дочернего процесса, передаёт ему сигналы и ввод пользователя, ожидает его завершения (системный вызов wait);

Рисунок 2.3. Запуск команды оболочкой

Запуск команды оболочкой

Возвращаемое значение

Каждый процесс при завершении возвращает своему родительскому процессу специальный код завершения программы. Этот код может использоваться для получения результата выполнения программы и для проверки корректности её выполнения (возврата кода ошибки).

Традиционно для UNIX, в случае успешного выполнения программа (а также большинство системных функций) возвращает значение 0 . Другие значения (все, отличные от 0 ) означают тот или иной вид ошибки. Так как программы часто выводят инфоромацию об ошибках через специальный поток вывода ошибок (stderr), возвращаемые значения чаще всего могут принимать только два значения: « ноль » и « не ноль ».

Если рассмотреть простейший пример программы на языке C:

Пример 2.2. Возвращаемое значение в программе на языке C

видно, что программы передают код завершения через возвращаемое значение главной функции ( main ) или как параметр функции exit .

В командной строке результат выполнения программы можно проанализировать с помощью специальной переменной ( $? ):

Способы объединения команд

Существует возможность объединять несколько команд в одной командной строке. Это можно делать несколькими способами:

Команды выполняются одна за другой, не зависимо от результата их исполнения. В качестве разделителя выступает символ точки с запятой (« ; »).

В качестве примера можно рассмотреть составную команду du -sh; date , которая выводит на экран содержимое домашней директории, а затем текущие дату и время.

Условное выполнение (И)

Проверяется код завершения первой программы, если он равен 0 , производится выполнение второй программы, и так далее. Таким образом, последняя команда выполнится только при успешном завершении всех предыдущих. В качестве разделителя выступают два амперсанда (« && »).

В качестве примера можно рассмотреть составную команду test -r /tmp/txt && cp /tmp/txt . , которая проверяет возможность чтения файла /tmp/txt и в случае успеха, копирует этот файл в локальную директорию.

Условное выполнение (ИЛИ)

Проверяется код завершения первой программы, если он не равен 0 , производится выполнение второй программы, и так далее. Последняя команда будет запущена только если ни одна из предыдущих не закончилась успешно. В качестве разделителя выступают две вертикальный черты (« || »).

В качестве примера можно рассмотреть составную команду test -d /tmp/dir || mkdir /tmp/dir , которая проверяет существование директории /tmp/dir и если её нет, создаёт её.

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

Все программы могут быть запущены одновременно, так чтобы обеспечить интерактивность вывода при прохождении данных через цепочку программ. Если одна из программ в цепочке конвейера завершится (например, в случае ошибки), остальным будет отправлен специальный сигнал (SIGPIPE).

В качестве разделителя используется символ вертикальный черты (« | »).

Рассмотрим пример команды cat file.txt | uniq | sort , которая читает содержимое файла file.txt , удаляет из него повторяющиеся строки и сортирует оставшиеся строки по алфавиту. Результат выводится на экран.

Современные командные оболочки позволяют строить более гибкие условные выражения (с импользованием скобок и знака отрицания) из выполняющихся команд.

Служебные символы

Из предыдущих разделов видно, что в командной строке присутствует множество служебных символов , каждый из которых имеет своё значение. Все эти символы следует с осторожностью использовать в именах файлов.

Рассмотрим основные группы служебных символов командной оболочки:

Используются для отлеления частей команды или нескольких команд. К ним относятся: пробел, табуляция. По умолчанию команды разделяются символом перевода строки. При использовании символа пробела в именах файлов необходимо заключать параметр в кавычки или предварять пробел символом обратной косой (« \ »).

Используются для разделения элементов пути. Сюда можно отнести символ корня (« / ») и символ домашней директории («

») – в командной строке он автоматически заменяется на полный путь к домашней директории. При этих символов в именах файлов необходимо предварять их символом обратной косой (« \ »).

Применяются в аргументах команд, для отделения нескольких команд, для запуска процессов на заднем фоне и т.п. К таким символам можно отнести: « * », « & », « < », « > », « ; », « ( », « ) », « | », « » ». При этих символов в именах файлов необходимо предварять их символом обратной косой (« \ »).

Символ параметров команды

Символ « — » используются для задания параметров команд. Проблемы могут возникнуть, если имя файла начинается с этого символа – в этом случае командная оболочка может принять такой аргумент за набор параметров. Стандартным выходом из этой ситуации является явное указание окончания списка параметров с « — », например:

Символы управления переменными

Используются для задания (« = ») и подстановки (« $ ») значений переменных среды. При этих символов в именах файлов необходимо предварять их символом обратной косой (« \ »).

Специальные ASCII-символы, вроде возврата каретки или табуляции. Их синтаксис эквивалентен используемому в языке C – с применением символа обратной косой (« \ »).

Программное окружение

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

В UNIX дочерний процесс – точная копия родительского, поэтому его окружение – также точная копия родительского. Если про дочерний процесс известно, что он использует значения некоторых переменных из числа передаваемых ему с окружением, родительский может заранее указать, каким из копируемых в окружении переменных нужно изменить значение. При этом, с одной стороны, никто (кроме системы, конечно) не сможет вмешаться в процесс передачи данных, а с другой стороны, одна и та же утилита может быть использована одним и тем же способом, но в измененном окружении – и выдавать различные результаты:

В последнем примере пользователь присвоил некоторое значение переменной окружения в командной строке перед именем команды. Командный интерпретатор, увидев « = » внутри первого слова командной строки, приходит к выводу, что это – операция присваивания, а не имя команды, и запоминает, как надо изменить окружение команды, которая последует далее. Переменная окружения LC_TIME предписывает использовать определенный язык при выводе даты и времени, а значение «C» соответствует стандартному системному языку (чаще всего – английскому).

Для получения значения переменной окружения необходимо воспользоваться символом « $ »:

Стандартные переменные окружения

При старте командной оболочки, инициализируется множество системных переменных, которые можно посмотреть с помощью команды env . Некоторые из них представляют особый интерес для пользователя системы:

Переменная используется графической подсистемой X11 и указывает на адрес X-сервера и номер используемого экрана (подробнее об этом будет сказано в разделе Глава 7, Графическая подсистема UNIX).

Если какая-то утилита требует редактирования файла, то вместо написания и использования встроенного редактора, этот файл можно передать на редактирование программе, путь к которой хранится в переменной EDITOR .

Переменная сожержит имя домашней директории текущего пользователя.

Переменная окружения содержит список директорий, разделённый символом « : ». Этот список просматривается при каждом запуске команды – в нём производится поиск исполнемых файлов с соответвтующем команде именем. Примером значения переменной окружения может быть « /bin:/usr/bin:/usr/local/bin ».

Как правило, значение этой переменной различается для простого пользователя и администратора – для того, чтобы разделить их рабочий инструментарий.

Имя текущей программы оболочки.

Тип терминала, используемого в настоящий момент. Эта переменная анализируется программами для того, чтобы варьировать свой интерфейс в зависимости от возможностей терминала.

Имя текущего пользователя.

_ (одиночный символ подчёркивания)

В точности последняя команда, выполненная в командной оболочке.

Возможности интерфейса командной оболочки

Современные командные оболочки, например bash предоставляют пользователю ряд удобных особеностей пользовательского интерфейса, облегчающих работу с командной строкой.

Редактирование командной строки

Вводимую команду можно редактировать с помощью клавиш Backspace и Delete , перемещаться стрелками по всей строке.

Для управления запущенными командами используются сочетания клавиш. Ввод следует завершать командой Ctrl + D (конец ввода). Эту команду интерпретирует при вводе с терминала система. Она же превращает некоторые другие управляющие символы (например, Ctrl + C – « перывание » или Ctrl + Z – « засыпание ») в сигналы.

Командная оболочка позволяет настраивать все функциональные клавиши и команды. Настройки ввода для bash располагаются в файле /etc/inputrc .

История команд

Двумя другими клавишами со стрелками – вверх и вниз – задействуется весьма мощный механизм bash – работа с историей команд . Все команды, набранные пользователем, командная оболочка запоминает и позволяет обращаться к ним впоследствии. По стрелке вверх, список поданных команд « прокручивается » от последней к первой, а по стрелке вниз – обратно. Соответствующая команда отображается в командной строке как только что набранная, её можно отредактировать и подать оболочке (подгонять курсор к концу строки при этом необязательно).

Чтобы история команд могла сохраняться между сеансами работы пользователя, bash записывает ее в файл .bash_history , находящийся в домашнем каталоге пользователя. Делается это в момент завершения оболочки: накопленная за время работы история дописывается в конец этого файла. При следующем запуске командной оболочки считывает .bash_history целиком. История хранится не вечно, количество запоминаемых команд в .bash_history ограничено (обычно сохраняется 500 команд, но это можно и перенастроить).

Псевдонимы

Поиск по истории – удобное средство: длинную командную строку можно не набирать целиком, а отыскать и использовать. Однако давнюю команду придется добывать с помощью нескольких нажатий клавиши вверх – а можно и совсем не доискаться, если она уже выбыла оттуда. Для того чтобы оперативно заменять короткие команды длинными, стоит воспользоваться псевдонимами (aliases). В конфигурационных файлах командного интерпретатора пользователя обычно уже определено несколько сокращений, список которых можно посмотреть с помощью команды alias без параметров:

Например, по команде ls вместо утилиты /bin/ls bash запускает собственную команду-сокращение, превращающееся в команду ls —color=auto . Повторно появившуюся в команде подстроку «ls» интерпретатор уже не обрабатывает, во избежание вечного цикла. Например, команда ls -al превращается в результате в ls —color=auto -al .

Сокращения не наследуются с окружением.

Автодополнение

Автодополнения позволяют быстро набирать команды и пути в файловой системе. Во время набора имени команды или файла пользователь может нажать клавишу Tab , и командная оболочка попытается « дополнить » указанную команду или файл: предложит возможные варианты с данным началом или же дополнит имя, ведь часто набранной строки – пути к файлу и нескольких первых букв его имени – достаточно для однозначного указания на этот файл, потому что по введенному пути других файлов, чье имя начинается на эти буквы, просто нет.

Шаблоны

Автодополнение очень удобно, когда цель пользователя – задать один конкретный файл в командной строке. Если же нужно работать сразу с несколькими файлами – например, для перемещения их в другой каталог с помощью mv, достраивание не помогает. Необходим способ задать одно « общее » имя для группы файлов, с которыми будет работать команда. В подавляющем большинстве случаев это можно сделать при помощи шаблона .

Шаблон в командном интерпретаторе используется примерно в тех же целях, что и регулярное выражение, которое будет описано в разделе «Команды, использующие регулярные выражения»: для поиска строк определенной структуры среди множества разнообразных строк. В отличие от регулярного выражения, шаблон всегда примеряется к строке целиком, кроме того, он устроен значительно проще (а значит, и беднее).

Символы в шаблоне разделяются на обычные и специальные. Обычные символы соответствуют таким же символам в строке, а специальные – обрабатываются особым образом:

Шаблону, состоящему только из обычных символов, соответствует единственная строка, состоящая из тех же символов в том же порядке. Например, шаблону « abc » соответствует строка abc , но не aBc или ABC , потому что большие и маленькие буквы различаются.

Шаблону, состоящему из единственного спецсимвола « * », соответствует любая строка любой длины (в том числе и пустая).

Шаблону, состоящему из единственного спецсимвола « ? », соответствует любая строка длиной в один символ, например, a , + или @ , но не ab или 8888 .

Шаблону, состоящему из любых символов, заключенных в квадратные скобки « [ » и « ] » соответствует строка длиной в один символ, причем этот символ должен встречаться среди заключенных в скобки. Например, шаблону « [bar] » соответствуют только строки a , b и r , но не c , B , bar или ab . Символы внутри скобок можно не перечислять полностью, а задавать диапазон, в начале которого стоит символ с наименьшим ASCII-кодом, затем следует « — », а затем – символ с наибольшим ASCII-кодом. Например, шаблону « [0-9a-fA-F] » соответствует одна шестнадцатеричная цифра (скажем, 5 , e или C ). Если после « [ » в шаблоне следует « ! », то ему соответствует строка из одного символа, не перечисленного между скобками.

Шаблону, состоящему из нескольких частей, соответствует строка, которую можно разбить на столько же подстрок (возможно, пустых), причем первая подстрока будет отвечать первой части шаблона, вторая – второй и т. д. Например, шаблону « a*b?c » будут соответствовать строки ab@c (« * » соответствует пустая подстрока), a+b=c и aaabbc , но не будут соответствовать abc (« ? » соответствует подстрока c , а для « c » соответствия не находится), @ab@c (нет соответствия для « a ») или aaabbbc (из трех b первое соответствует « b », второе – « ? », а вот третье приходится на « c »).

Шаблоны используются в нескольких конструкциях shell. Главное место их применения – командная строка. Если оболочка « видит » в командной строке шаблон, она немедленно заменяет его списком файлов, имена которых ему соответствуют. Команда, которая затем вызывается, получает в качестве параметров список файлов уже без всяких шаблонов, как если бы этот список пользователь ввел вручную. Шаблоны используются в нескольких конструкциях shell. Главное место их применения – командная строка. Если оболочка « видит » в командной строке шаблон, она немедленно заменяет его списком файлов, имена которых ему соответствуют. Команда, которая затем вызывается, получает в качестве параметров список файлов уже без всяких шаблонов, как если бы этот список пользователь ввел вручную.

Командная оболочка как средство программирования

Большая часть того, что нужно начинающему пользователю UNIX, делается с помощью одной правильной команды, или вызовом нескольких команд в конвейере. От пользователя только требуется оформить решение задачи в виде сценария на shell. На самом же деле уже самый первый из командных интерпретаторов, sh , был настоящим высокоуровневым языком программирования – если, конечно, считать все утилиты системы его операторами. При таком подходе от sh требуется совсем немного: возможность вызывать утилиты, возможность свободно манипулировать результатом их работы и несколько алгоритмических конструкций (условия и циклы).

Программирование на shell, а также других, более мощных интерпретируемых языках в UNIX, остается за рамками этого курса.

Справочная подсистема

Работать с UNIX, не заглядывая в документацию, практически невозможно. Это возможно, потому что документированы практически все области операционной системы. Всем пользователям настоятельно рекомендуется, приступая к работе, а тем более – к изучению UNIX, пользоваться всеми доступными руководствами. Исторически первым и основным средством документации во всех версиях являются страницы руководства (manual pages), которые будут подробно рассмотрены далее.

Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский – не родной язык для автора документации, она будет только проще. Традиция писать по-английски идет от немалого вклада США в развитие компьютерной науки вообще и UNIX в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием UNIX. Дело не в том, что страницу руководства нельзя перевести, а в том, что ее придется переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации.

Документация в UNIX играет важнейшую роль. Решение любой задачи должно начинаться с изучения руководств. Не стоит жалеть на это времени. Даже если рядом есть опытный пользователь UNIX, который, возможно, знает ответ, не стоит беспокоить его сразу же. Возможно, даже зная, что нужно сделать, он не помнит как именно – и поэтому (а также потому, что он – опытный пользователь) начнет с изучения руководства. Это – закон, у которого даже собственное название: RTFM , что означает « Read That Fine Manual ».

Современные свободные UNIX-системы обладают большим сообществом пользователей и разработчиков, объединённых через Интернет. В этих сообществах является нормальной практикой взаимопомощь и ответы на вопросы по системе. Однако, здесь необходимо следовать описанному выше принципу RTFM .

Страницы руководтсва

Больше всего полезной информации содержится в страницах руководства , для краткости мы будем называть их просто « руководство ». Каждая страница посвящена какому-нибудь одному объекту системы. Для того чтобы посмотреть страницу руководства, нужно дать команду системе man объект :

Страница руководства занимает, как правило, больше одной страницы экрана. Для того чтобы читать было удобнее, man запускает программу постраничного просмотра текстов – less. Управлять программой less просто: страницы перелистываются пробелом, а когда читать надоест, надо нажать q (Quit). Перелистывать страницы можно и клавишами Page Up / Page Down , для сдвига на одну строку вперед можно применять Enter или стрелку вниз, а на одну строку назад – стрелку вверх. Переход на начало и конец текста выполняется по командам g и G соответственно (Go). Полный список того, что можно делать с текстом в less , выводится по команде h (help). Для поиска и подстветки интересующего понятия можно воспользоваться командой / , после которой необходимо ввести интересующий Вас термин – по нажатию клавиши Enter , курсор перейдёт к первому упоминанию термина, который будет выделен серым цветом. Последующие нажатия / и Enter приведут к продолжению поиска слова по документу.

Страница руководства состоит из полей – стандартных разделов, с разных сторон описывающих заинтересовавший объект – например, команду cal . В поле NAME содержится краткое описание объекта (такое, чтобы его назначение было понятно с первого взгляда). В поле SYNOPSIS дается формализованное описание способов использования объекта (в данном случае – того, как и с какими параметрами запускать команду cal ). Как правило, в квадратные скобки в этом поле заключены необязательные параметры команды, которые можно ей передать, а можно и опустить. Например, строка « [[month] year] » означает, что в этом месте командной строки параметров у команды может не быть вообще, может быть указан год или пара – месяц и год. Наконец, текст в поле DESCRIPTION – это развернутое описание объекта, достаточное для того, чтобы им воспользоваться.

Одно из самых важных полей руководства находится в конце текста. Если в процессе чтения NAME или DESCRIPTION пользователь понимает, что не нашел в руководстве того, что искал, он может захотеть посмотреть, а есть ли другие руководства или иные источники информации по той же теме. Список таких источников содержится в поле SEE ALSO:

Справочные руководства делятся на разделы – в зависимости от типа описываемых объектов. Если один и тот же термин описывается в нескольких разделах, необходимо явно указать, какой из них использовать, например, man 3 printf для 3-го раздела руководств.

Оболочка Bash — шпаргалка для начинающих

Обложка: Оболочка Bash — шпаргалка для начинающих

В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.

Оболочка Bash: введение

Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.

Навигация

В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.

Команда pwd , сокращение от print working directory, отображает текущее местоположение в структуре каталогов.

Команда cd позволяет перейти в новый каталог.

mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

Основные команды

Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat :

Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.

Команда echo выводит свои аргументы по стандартному каналу вывода.

Если вызвать echo без аргументов, будет выведена пустая строка.

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:

Команда tail работает аналогично команде head , но читает строки с конца:

Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f :

Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.

Подробнее о назначении символа | будет рассказано ниже в разделе команды history .

Обычные сочетания клавиш Описание
G Перемещает в конец файла
g Перемещает в начало файла
:50 Перемещает на 50 строку файла
q Выход из less
/searchterm Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки
/ Перемещает на следующий подходящий результат поиска
?searchterm Поиск строки, совпадающей с ‘searchterm’, выше текущей строки
? Перемещает на следующий подходящий результат поиска
up Перемещает на одну строку выше
down Перемещает на одну строку ниже
pageup Перемещает на одну страницу выше
pagedown Перемещает на одну страницу ниже

Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.

false

Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.

$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):

Команда grep занимается поиском переданной строки в указанном файле:

grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

Обычные флаги Описание
-i Отключение чувствительности к регистру
-r Рекурсивный поиск по директориям
-w Поиск только целых слов
-c Вывод количества найденных элементов
-n Вывод всей строки, содержащей запрос
-v Вывод инвертированного совпадения

Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.

Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g . Например, следующий код заменит все слова «Hello» на «Hi»:

Также вы можете ознакомиться с руководством по sed.

history

Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :

Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .

Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.

export

Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student :

Команда ps выводит информацию о запущенных процессах.

Выводится четыре элемента:

  • ID процесса (PID),
  • тип терминала (TTY),
  • время работы процесса (TIME),
  • имя команды, запустившей процесс (CMD).

Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern ‘ test.txt

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.

Команда ping тестирует сетевое подключение.

Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.

Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.

Переменные окружения

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

Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.

Переменная HOME содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

Коннектор Описание
&& Первая команда исполняется всегда, вторая — только в случае успешного завершения первой
|| Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой
; Команды исполняются всегда

Конвейеры

Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.

Перенаправление ввода/вывода

Перенаправление вывода

Для стандартного перенаправления вывода используются символы > и >> .

Например, этот код передаст вывод ls в файл, а не на экран:

Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.

Перенаправление ввода

Для стандартного перенаправления вывода используется символ < . В следующем примере sort берет входные данные из файла, а не с клавиатуры:

Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:

Продвинутое перенаправление

Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .

Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .

Имя Дескриптор Описание
stdin 0 Стандартный поток ввода
stdout 1 Стандартный поток вывода
stderr 2 Стандартный поток вывода ошибок

Например, для перенаправления stderr в test.txt нужно сделать следующее:

Права доступа

Команда ls -l выводит много информации о правах доступа к каждому файлу:

Вывод в примере Описание / возможные выводы
Тип файла:
— файл
d каталог
rw- Права доступа владельца файла
rw- Права доступа членов группы-владельца файла
r— Права доступа прочих пользователей
user Имя владельца файла
group Имя группы-владельца файла
chmod

Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:

Буква Пользователь
u Владелец
g Член группы
o Прочие пользователи
a Все пользователи

Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ — обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:

Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *