Объединение команд и особенности грамматики командной оболочки Баш, что полезно знать Начинающему.

Всем, доброго.

В статьей «Объединение команд и особенности грамматики командной оболочки Баш, что полезно знать Начинающему», мы с вами, рассмотрим объединения команд между собой, применение шаблонов имен для обобщения имен групп файлов, а также подстановку результата выполнения команды в аргументы другой команды.

Введение

Понимаю, что начинаю понемногу усложняться в своих статьях. Однако, напомню, что пишу статьи для тех, кто готов постепенно обучиться основам и азам командной строки Линукс, для созидания отправной точки в себе, чтобы потом применять ее в качестве отправного момента в своих дальнейших начинаниях на просторах ОС Линукс. Поэтому, сложность и объем не меняются мною на уровне Начинающего Линуксоида, меняется содержание статей. Так что, рекомендую привыкнуть к этому, т.к. сам предпочитаю, нормально пройтись по основам и азам, чтобы потом перейти к интересному на уровне Любителя, с уже более кратким изложением, где вам пригодятся ваши познания. А уж там, как учились, так поймете сказанное, поэтому продолжим в том же духе и настрое, благо, это, развивает в нас то, что требуется для дальнейшего развития в себе.

Шаблоны имен файлов.

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

Также стоит отметить, что для применения шаблонов имен файлов не обязательно уметь работать с регулярными выражениями, однако это не значит, что нельзя применять. Но, есть одно маленькое и интересное «Но», т.к. в отличие от «Окон» Шмякософта в Линуксе, все является файлами и шаблоны имен файлов составляются простым способом без применения регулярных выражений, т.е. применять их легко, просто, удобно, практично, в том числе их применение дает доступ к интересным возможностям применения основных команд, после чего вы уже начнете понимать, что «Окна» имеют сильно «урезанный» вариант командной строки, которую незаслуженной сократили, обрезали, сделав ее совсем ущербной, таки не сумев без нее обойтись со всеми своими идеологическими замашками, проявив эдакий «скрытый фашизм» по отношению к командной строке, что явно говорит о «больном восприятии» создателей «Окон». Так что не будем увлекаться дальнейшими пояснениями по данной теме, чтобы не увлекаться и не отвлекаться от темы статьи.

Так что, можно сказать, что для простых шаблонов имен файлов достаточно применять «*», «?», «[…]». Однако, пройдемся подробнее по каждому из них.

Для начало, рассмотрим «*», которая имеет одну особенность по сравнению версией в «Окнах», т.к. в Линуксе она включает все начиная от текущей директории, включая директории внутри текущей, однако пропуская скрытые файлы, которые нельзя включать по логике безопасности. Т.к. для скрытых файлов, есть другой способ составления их списка «.*», благодаря которому будут включены только скрытые файлы, но также «.» (текущая директория) и «..» (директория уровнем выше). Однако, учитывая особенности Линукс по отношению к файлам, о чем говорилось в предыдущих статьях, чтобы включить в список файлов все файлы с расширениями, стоит применять, так «*.*». А также в классическом варианте, например «фыва*», будет включать в список имен все файлы начинающиеся с «фыва». Или, например «*фыва*», будет включать в список имен все файлы содержащие «фыва». Или, например «*фыва», будет включать в список имен все файлы заканчивающиеся на «фыва».

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

Символы находящиеся между «[» и «]»  заменяют собой только один символ, однако также можно указывать множества «а-я», «А-Я», «a-z», «A-Z», «0-9». Однако, при применении русских букв стоит обращать внимание на переменную «$LANG», которая указывает на обращаемые множества букв, а также на то, что «рекомендуют», чтобы переменная «$LC_ALL» была пустой для корректной работы со множествами букв.

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

Например, можно сделать так:

Причина такой реакции команда ls в том, что она ищет все файлы, на текущем уровне, уровнем ниже (1 глубина прохода) и уровнем выше (1 глубина прохода), при выполнении с «.*». Причина этому, показана ниже.

Т.е. две точки не являются полностью скрытыми, они «технические адресации» на определенное место для взаимосвязи между файлами, чтобы таким образом создать пространство, которое мы воспринимаем пространством жесткого диска. Т.к. файлы-директории связаны между собой и обычными файлами, имея данные об адресах начала чтения файлов (вспомните, что в Линуксе все представлено файлами, в том числе то, чего нету на жестком диске, однако в специальных директориях, доступных привычным способом). Линукс собирая всю эту информацию хранит ее в хранилищах размещения файлов в ext и прочих форматах разделов, которое есть на каждом разделе носителя (у каждого раздела формат только один ext, fat, ntfs и т.д.). Т.о. Линукс «знает» о том, где и какие файлы сохранены, а «.» и «..», хранят часть этой информации для облегчения навигации между файлами, т.к. оно стало привычным со временем развития «быстродействия» и объема памяти, так что первая хранит адрес размещения текущей директории, а вторая директории уровнем выше. Аналогично будет у директории выше, по саму корневую директорию, которая в своем пространстве будет ссылаться в обоих случаях на себя. Т.о. создается простая навигация без необходимости, каждый раз «дергать» ОС по простым запросам в хранилище размещения. Поэтому, когда вы заходите в определенное пространство директории и применяете шаблон списка имен «*», то он применяет все что доступно без «.» в начале, при этом берет все из «.», т.е. текущей директории. Т.к. на практике Линукс оперирует полным именем файла, т.е. всегда идет «./*», а для применителя доступны сокращения в виде «./» (текущая директория), «../» (уровнем выше), «/» (корневая). Однако, когда ставится «./.*», или «../.*», или «/.*», то формируется список имен начиная с указанного места, включая все файлы в том числе «.», «..», в том числе скрытые. 

После такого пояснения, посмотрев на пример выше не сложно понять, пример еще выше, т.к. становится понятным, что Баш сам запускает команду ls с уже набранным списком имен файлов, которые требуется отобразить. А, пример ниже, показывает как Баш пишет и запускает сам команду ls, только в этом случае все имена файлов перечислены вручную, вывод аналогичен предыдущему аналогичному примеру.

Также вы можете сделать запуск всех скриптов в текущей директории, запустив.

Или выполнить открытие всех файлов, в текущей директории, с расширением pdf через просмоторщик.

Или выполнить открытие всех файлов, в  текущей директории, с расширение png в Gimp.

В этом случае, будет происходить открытие всех файлов с расширение «png» и «PNG». Если не будет файлов с расширением «PNG», то вам попросту будет дано маленькое диалоговое сообщение о том, что такого файла не существует, однако это не закроет программу, что является нормальной реакцией программы, которая принимает запуск программы с открытие файла на момент своего запуска. Учитывая при этом, что программа GIMP является графическим редактором, которая способна принимать сразу несколько файлов для открытия, то результат ее реакции нормален сам по себе — открывается несколько окошек с картинками, без открытия всех окон с равным кол-вом раз. Однако, программа xreader открывает их в отдельных окнах в виду простоты свое реализации. Аналогично, простой текстовый редактор xed откроет требуемое кол-во вкладок соизмеримое кол-во имен файлов в полученном списке. Однако, несмотря на все эти удобства, есть свое не удобство в работе с программами не применяющими возможности командной строки Линукс, например программа djview не будет ничего открывать, сославшись на неправильный аргумент, т.к. она ориентирована больше на ГИП, поэтому в проводнике можно открыть несколько документов ее формата через контекстное меню при щелчке правой кнопкой по одному из выделенных файлов и выборе запуска данной программы или «открыть с помощью», что является всем знакомым инструментом ГИП. Так что, если у вас есть неудобства от подобного подхода, однако такой подход через командную строку востребован, то ищите программы с такими возможностями. Те, кто с таким сталкивался, поймут автора данной статьи, т.к. такие возможности, абы просто так, не создаются.

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

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

Подстановка команд чаще всего применяется в сценариях (скриптах), однако не смотря на это она может быть практична для вас в обычном применении. Так что поясню ее вкратце, т.к. когда дело дойдет до сценариев, тогда стоит ее проявить, а пока что, достаточно малого. Поэтому, от себя скажу то, что команда выполняется в дополнительном процессе, связанным с текущим Баш, который применяется для выполнения такой, составной, команды, а результат возвращается в место текущей, выполняемой команды, где была указана подстановка, чтобы после продолжить дальнейшую обработку аргументов текущей команды и выполнить саму текущую команду в конечном итоге. Это, все, что можно сказать в общем и целом об этой возможности в командной строке Линукс в Баш. А теперь, рассмотрим, как это делается на общем виде и примерах, чтобы вам была понятна в общем и целом суть и смысл данной возможности.

Подстановка, в общем и целом, делается таким способом.

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

Однако, несмотря на такие рекомендации, всегда практично применение обоих вариантов для конструкций своих команд. В основном это все применяется в сценариях.

Я бы показал, вам, несколько интересных моментов, однако оставим их для статей уровня Линуксоид-Любитель. А пока что, запомните для себя то, что подстановка результатов выполнения одной команды (в том числе сложной), в качестве входного аргумента делается вышеобозначенными способами, которые чаще всего применяются оба.

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

Выполнение нескольких команд одной строкой.

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

Для наглядности, посмотрите на этот пример.

Здесь, было задано несколько команд на исполнение, вне зависимости от результата выполнения предыдущей команды, в виде одной команды. При этом, заметьте, что в конце не обязательно ставить символ разграничения команд.

Выполнение команды после выполнения другой команды без ошибок.

Чаще всего требуются объединения команд, которые обязаны быть выполнены в случае «хорошего выполнения» команды, т.е. без ошибок, что говорит о том, что выполнение следующей команды имеет смысл. Например, для выполнения команды удаления или обновления через консоль в ГИП/ПГИПе.

Например.

Выполнение команды после выполнения другой команды с ошибками.

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

Например.

В примере, видна попытка обращения к директории в плане чтения, т.к. везде в правах доступа стояла только запись и ничего более, поэтому мы получили не нулевое значение команды «ls», что привело ее к состоянию ошибки и невыполнения, что в свою очередь запустила команду «echo».

В заключение.

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

В следующей статье, будет такая же краткая информация о каналах ввода/вывода и применение команд-фильтров. А в данной статье, мы с вами, немного ознакомились с применением шаблона имен файлов, а также с различного рода объедиенениями команд в Баше, которые он нам предоставляет.

Спасибо, за внимание, всего доброго.

Loading