shell — вопросы с ответами

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

Shell переводит ваши команды и отправляет их в систему. Большинство дистрибутивов Linux поставляются с большим разнообразием оболочек.

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

  • Sh shell: также называемая оболочкой Борна, разработанная в AT&T labs в 70-х годах парнем по имени Стивен Борн. Эта оболочка отличается богатым функционалом;
  • Bash shell: также называемая Bourne again shell. Очень популярна и совместима со сценариями sh-оболочки, поэтому вы можете запускать свои sh-сценарии без каких-либо изменений;
  • Ksh shell: также называется оболочкой Korn, она совместима с sh и bash. Ksh предлагает некоторые улучшения по сравнению с оболочкой Bourne;
  • Csh и tcsh: Linux был построен с использованием языка C, и это побудило разработчиков из Университета Беркли разработать оболочку в стиле C, в которой синтаксис подобен языку C. Tcsh добавляет некоторые незначительные улучшения в csh.

Каждый вариант оболочки имеет свой собственный набор распознаваемых команд и функций. Все оболочки расположены либо в каталоге /usr/bin/, либо в каталоге /bin/, в зависимости от разновидности UNIX и конкретной версии системы.

Скрипты Shell

Основная концепция скриптов Shell – это список команд, которые перечислены в порядке их выполнения. Хороший сценарий оболочки будет иметь комментарии, перед которыми стоит знак фунта или знак хеша (#), описывающий шаги. Существуют условные тесты, такие как значение A больше значения B, циклы, позволяющие нам просматривать огромные объемы данных, файлы для чтения и хранения данных, переменные для чтения и хранения данных. Также скрипт может содержать функции.

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

Сценарии и функции оболочки интерпретируются. Это означает, что они не компилируются. И сценарии, и функции оболочки представляют собой текст ASCII, который читается интерпретатором команд Shell. Когда мы выполняем сценарий оболочки или функцию, интерпретатор команд просматривает текст ASCII строка за строкой, цикл за циклом, тест за тестом и выполняет каждый оператор при достижении каждой строки сверху вниз.

Функции

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

или

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

Запуск скриптов Shell

Shell-скрипт может быть выполнен следующими способами:

создаст оболочку Korn и выполнит shell_script_name во вновь созданной среде оболочки Korn. То же самое верно для оболочек sh и bash.

выполнит shell_script_name, если в файле установлен бит выполнения. Сценарий будет выполняться в оболочке, объявленной в первой строке сценария оболочки. Если оболочка не объявлена в первой строке сценария оболочки, она будет выполняться в оболочке по умолчанию, которая является определяемой системой оболочкой пользователя. Выполнение в непредусмотренной оболочке может привести к сбою и дать непредсказуемые результаты.

Объявление оболочки в скрипте Shell

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

Комментарии и стили в скриптах Shell

Создание хороших комментариев в наших скриптах играет очень важную роль в разработке. То, что для нас очевидно, может быть совершенно непонятно для тех, кто идет по нашим стопам. Мы должны написать код, который будет читабелен и прост для понимания. Это включает в себя написание скрипта, который легко читать и поддерживать, что означает, что в нем должно быть много комментариев, описывающих разные шаги. По большей части, тот, кто пишет скрипт оболочки, не является человеком, который должен его поддерживать. Нет ничего хуже, чем взламывать чужой код, у которого нет комментариев, чтобы узнать, что должен делать каждый шаг. Вначале может быть достаточно сложно изменить сценарий, но необходимость выяснить мышление автора сценария иногда заставляет нас задуматься о переписывании всего скрипта Shell с нуля. Мы можем избежать этого, написав хорошо читаемый скрипт и вставив множество комментариев, описывающих нашу философию и то, как мы используем ввод, вывод, переменные и файлы.

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

Удобочитаемость команд и пошаговые комментарии – это только основы хорошо написанного сценария. Использование большого количества комментариев значительно облегчит нашу жизнь, когда мы вернемся к коду, не глядя на него в течение шести месяцев. Комментируйте все! Сюда входит и описание того (но не ограничивается этим), для чего используются наши переменные и файлы, описанием того, что делают циклы, описанием каждого теста, включая ожидаемые результаты и как мы манипулируем данными и множеством полей данных. Хеш-знак # предшествует каждой строке комментария.

Использование break, continue, exit и return

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

  • Команда break используется для прекращения выполнения всего цикла после завершения выполнения всех строк кода вплоть до оператора break. Затем она спускается до кода, следующего за концом цикла;
  • Команда continue используется для передачи управления следующему набору кода, но она продолжает выполнение цикла;
  • Команда exit будет делать то, что и следовало ожидать: она завершает весь сценарий. Целое число может быть добавлено к команде exit (например, exit 0), которая будет отправлена как код возврата;
  • Команда return используется в функции для отправки данных обратно или возврата результата или кода возврата вызывающему скрипту.

Переменные

Переменная – это строка символов, которой мы присваиваем значение. Назначенное значение может быть числом, текстом, именем файла, устройством или данными любого другого типа. Переменная является не чем иным, как указателем на фактические данные. Мы будем использовать переменные в наших сценариях так часто, что для нас будет необычным их не использовать. Использование имен переменных в верхнем регистре не рекомендуется в реальном мире программирования оболочки, так как эти переменные в верхнем регистре могут наступать на системные переменные среды, которые также находятся в верхнем регистре. Когда вы пишете свои собственные скрипты Shell, делайте переменные строчными буквами. Чтобы назначить переменную для указания на данные, мы используем UPPERCASE= “value_to_assign” в качестве синтаксиса присваивания. Чтобы получить доступ к данным, на которые указывает переменная UPPERCASE, мы должны добавить в качестве префикса знак доллара $, например, $UPPERCASE. Для просмотра данных, назначенных переменной, мы используем echo $UPPERCASE, print $UPPERCASE для переменных или cat $UPPERCASE, если переменная указывает на файл, в качестве структуры команды.

Корректное использование команды echo

Мы используем команду echo для отображения текста. Команда echo позволяет использовать множество элементов управления курсором с использованием операторов обратной косой черты: n для новой строки, c для продолжения на той же строке, b для возврата курсора, t для табуляции, r для возврата каретки и v для вертикального перемещения на одну строку. В оболочке Korn команда echo по умолчанию распознает эти параметры команды. В оболочке Bash мы должны добавить ключ -e к команде echo, echo -e “n”для одной новой строки.

Мы можем запросить систему на наличие исполняемой оболочки, запросив переменную оболочки $SHELL в скрипте. Многие дистрибутивы Linux будут выполняться в оболочке Bash, даже если мы указываем оболочку Korn в самой первой строке скрипта. Поскольку оболочка Bash требует использования переключателя echo -e для включения операторов обратной косой черты, мы можем использовать оператор case для псевдонима команды echo для вывода echo -e, если исполняемая оболочка */bin/bash. Теперь, когда нам нужно использовать команду echo, мы уверены, что она будет правильно отображать текст.

Добавьте следующий сегмент кода ко всем своим сценариям оболочки Korn в разделе объявления переменных, и эта небольшая проблема будет решена:

3 ответа
У меня есть путь к целевому файлу, который структурирован как пример ниже. C:\Program Files\Test\foobar.exe /G Что мне нужно сделать, так это выполнить этот файл с помощью команды vba shell(). Как мне форматировать путь к файлу, чтобы сообщить shell(), что есть аргумент, который ему нужно вызвать в...
excel-vba
parameters
command-line-arguments
04 янв. 2014, в 05:51
1 ответ
У меня есть фиксированная команда, которую мне нужно передать в командную строку с помощью VBA, а затем выполнить команду. например "perl a.pl c:\temp" следующая - это команда, которую я пытаюсь использовать, но она просто открывает командную строку и не запускает команду. Call Shell("cmd.exe -s:"...
command-line
30 июль 2013, в 19:35
4 ответа
У меня есть исполняемый файл, который я вызываю с помощью команды оболочки: Shell (ThisWorkbook.Path & "\ProcessData.exe") Исполняемый файл выполняет некоторые вычисления, затем возвращает результаты в Excel. Я хочу, чтобы иметь возможность изменять формат результатов ПОСЛЕ экспорта. Другими сл...
synchronous
17 янв. 2012, в 19:46
4 ответа
Я пытаюсь понять разницу между shell_exec() и exec()... Я всегда использовал exec() для выполнения команд на стороне сервера, когда я использовал бы shell_exec()? Является ли shell_exec() сокращением для exec()? Это похоже на то, что с меньшим количеством параметров....
exec
command
17 авг. 2011, в 13:00
4 ответа
Я создаю оболочку script для экспорта sqlite-запроса в файл csv, как это: #!/bin/bash ./bin/sqlite3 ./sys/xserve_sqlite.db ".headers on" ./bin/sqlite3 ./sys/xserve_sqlite.db ".mode csv" ./bin/sqlite3 ./sys/xserve_sqlite.db ".output out.csv" ./bin/sqlite3 ./sys/xserve_sqlite.db "select * from eS1100...
25 апр. 2011, в 08:00
14 ответов
Я хочу написать функцию, которая выполнит команду оболочки и вернет ее вывод в виде строки, независимо от того, является ли это сообщение об ошибке или успехе. Я просто хочу получить тот же результат, что и в командной строке. Каким будет пример кода, который бы сделал такую ​​вещь? Например: def r...
subprocess
21 янв. 2011, в 13:48
28 ответов
В PHP строки объединяются следующим образом: $foo = "Hello"; $foo .= " World"; Здесь $foo становится "Hello World". Как это достигается в Bash?
append
syntax
concat
string-concatenation
15 нояб. 2010, в 05:04
6 ответов
# sqlite3 /data/data/com.moodme.android/databases/moodme sqlite3 /data/data/com.moodme.android/databases/moodme sqlite3: not found
adb
rooted-device
05 сен. 2010, в 08:18
31 ответ
Как узнать, установлена ​​ли переменная в Bash? Например, как проверить, дал ли пользователь первый параметр функции? function a { # if $1 is set ? }
variables
30 авг. 2010, в 14:46
19 ответов
Мне кажется, что файлы работают без этой строки.
shebang
12 март 2010, в 00:35
42 ответа
У нас есть приложение PHP и мы хотим подсчитать все строки кода под определенным каталогом и его подкаталогами. Нам не нужно игнорировать комментарии, так как мы просто пытаемся получить приблизительную идею. wc -l *.php Эта команда отлично работает в пределах заданного каталога, но игнорирует под...
31 авг. 2009, в 17:36
34 ответа
У меня есть эта строка, хранящаяся в переменной: IN="bla@some.com;john@home.com" Теперь я хотел бы разделить строки на разделитель ;, чтобы у меня было: ADDR1="bla@some.com" ADDR2="john@home.com" Мне необязательно нужны переменные ADDR1 и ADDR2. Если они являются элементами массива, которые еще лу...
scripting
28 май 2009, в 03:51
16 ответов
В оболочке Unix, если я хочу объединить stderr и stdout в поток stdout для дальнейшей обработки, я могу добавить следующее в конце моей команды: 2>&1 Итак, если я хочу использовать "head" на выходе из g++, я могу сделать что-то вроде этого: g++ lots_of_errors 2>&1 | head поэтому я в...
redirect
04 май 2009, в 00:14
35 ответов
Как я могу проверить, существует ли программа, которая будет либо возвращать ошибку и выйти, либо продолжить с помощью script? Кажется, что это должно быть легко, но это меня колотило.
26 фев. 2009, в 22:33
56 ответов
Как я могу вызвать внешнюю команду (как если бы я набрал ее в оболочке Unix или в командной строке Windows) из Python script?
external
subprocess
command
18 сен. 2008, в 01:22
Наверх
Меню