Создание временных алисов
Временные алиасы отличаются от постоянных тем, что они доступны только на время текущей сессии терминала, т.е. если вы после создания временного алиаса закроете окно терминала, то алиас удалится. Временные алиасы могут быть полезны в момент работы не на своем компьютере или когда вы используете алиас, который в следующих сессиях вам не понадобится.
Для создания временного алиаса выполните в терминале команду — , где — имя алиаса, а — команда, которую вы хотите выполнить с помощью алиаса.
Для примера давайте создадим простой алиас команды перехода в корневой каталог:
Теперь чтобы убедится, что алиас создался и готов к использованию, найдем его в списке алиасов набрав простую команду — без аргументов:
Список доступных алиасов
Теперь для того чтобы выполнить переход в корневой каталог достаточно выполнить в консоли команду — :
Результат выполнения алиаса — g
nice и приоритет исполнения процессов
Если же мы хотим настроить приоритет программы, воспользуемся утилитой
(или программно с ). С помощью неё можно указать ОС, с каким
приоритетом мы бы хотели запустить программу. Приоритеты в Linux определяются
цифрами от -20 до 19. Чем меньше — тем приоритетнее. Для установки приоритета
ниже 0 необходимы права супер-пользователя (например, можно установить через
).
Есть ещё процесс idle (процесс для простоя процессора, или же программа
запущенная с политикой ), приоритет которого ниже 19 и
(для вытеснения процесса с ядра для миграции его на другой
процессор) — у него выше -20.
Для примера, запустим параллельно с разными приоритетами несколько экземпляров
предыдущей программы:
И посмотрим на результат выполнения:
Идут почти в порядке приоритетов.
Также есть для изменения приоритета процессу, группе процессов или
процессам определённого пользователя.
Посмотреть же приоритет запущенных процессов можно через утилиту , указав,
что нам хочется видеть и столбик nice (NI):
Краткая история выпуска
На основе загрузок, доступных с http://ftp.gnu.org/gnu/bash/
Кроме того, все версии для начиная с версии 2.0 и более поздних получили важный выпуск уровня исправления для устранения уязвимости Shellshock в сентябре 2014 года.
Прежде чем спрашивать о проблемном коде
Чтобы помочь добрым людям, которые помогают вам, чтобы будущие читатели могли извлечь пользу из вашего вопроса, и чтобы ваш вопрос был оценен как полезный для этой прекрасной кармы, сделайте ваш вопрос максимально простым и универсальным:
-
Проверьте, есть ли в вашем скрипте или данных символы конца строки в стиле DOS
Используйте cat -v yourfile или echo «$yourvariable» | cat -v. Возврат каретки DOS будет отображаться как ^M после каждой строки. Если Вы найдете их, удалите их, используя dos2unix (он же fromdos) или tr -d ‘\r’
-
Убедитесь, что вы запускаете скрипт с , а не
-
Первая строка в скрипте должна быть или .
Не должна быть
-
Запустите скрипт с помощью или .
Не запускайте его с .
Это применимо даже когда является символической ссылкой на .
-
-
Найдите небольшой автономный пример.
- Не включайте разделы и команды, не относящиеся к вашей проблеме.
- Избегайте сложных команд, которые просто служат для получения значения (непосредственно включают значение).
- Избегайте полагаться на внешние файлы . Создавайте файлы на лету, включайте данные напрямую или публикуйте небольшой пример файла в своем вопросе.
-
Проверьте свой пример. Убедитесь, что он работает и все еще показывает проблему. Не отмахивайтесь от этого.
- Переформатирование для ясности часто обходит ловушки, связанные с пробелами и именами.
- Рефакторинг для простоты часто обходит ловушки, связанные с подоболочками.
- Извлечение файлов и данных часто обходит проблемы, связанные со специальными символов.
- Часы, потраченные на разные вещи, часто приводят к публикации кода из одной версии и ошибок из другой.
-
Проверьте пример на общие проблемы
- Запустите ваш пример через или онлайн-сервис проверки оболочки, чтобы автоматически проверять наличие распространенных ошибок.
- Обзор Подводные камни Bashи Ошибки новичка Bash, а также в разделе «Популярные вопросы» ниже для ознакомления со списками распространенных проблем.
- Проверьте свои данные на наличие специальных символов, используя или . Будьте особенно осторожны с возвратом каретки (отображается как ).
-
Пожалуйста, избегайте пометки вопросов, которые касаются исключительно внешних команд. Тег должен быть зарезервирован для проблем, связанных с Bash, а не для проблем с CLI, которые у вас могут возникнуть.
Как превратить плохой сценарий в хороший вопрос
Например, допустим, у вас есть скрипт для оповещения о том, что сервер простаивает, но он продолжает оповещать, даже когда машина не простаивает:
- Проблема по-прежнему возникает без цикла: удалите цикл из вашего вопроса.
- Проблема по-прежнему возникает, если вы пропустите запрос к серверу: Жесткий код ответа (например, )
- Проблема по-прежнему возникает без отправки электронной почты: используйте
- Проблема по-прежнему возникает при удалении ветви else. Укоротить
Теперь мы остались с этим небольшим, автономным примером:
Спасибо за то, что сделали ваш вопрос простым и полезным! Приятных вам голосов!
(Однако учтите, что этот пример легко сравнить с соответствующей записью в , и ошибка автоматически обнаруживается { {X0}}, так что теперь вам не нужно спрашивать!)
Планировщики в Linux
К примеру, всё началось с планировщика O(n) — все задачи расположены в списке,
каждому исходя из приоритета присвоено определённое количество тиков (tick),
которые соответствуют time slice-ам. Ищем задачу с максимальным значением,
исполняем, понижаем счётчик тиков задачи. Если не можем найти задачи с
положительным счётчиком — поднимаем счётчик всем задачам, исходя из приоритета.
Очевидная проблема данного планировщика — при росте количества задач растёт и
время работы планировщика. Причём растёт линейно. В теории сложности вычислений
этот алгоритм относится к классу O(n) — рост времени вычисления растёт
пропорционально количеству входных данных.
Также данный планировщик имеет проблемы при работе с несколькими процессорами —
одна блокировка на одну очередь — то есть одновременно с ней может работать
только один процессор.
В 2002-ом году в Linux стали использовать более продвинутый планировщик — O(1).
Как можно догадаться, алгоритм работы был изменён. Время работы планировщика
более не зависело от числа запущенных процессов. Теперь у каждого процессора
было по паре списков. В первом отсортированном списке — текущие процессы,
ожидающие выполнения, во втором — исчерпавшие своё время. Как только первый
список заканчивался — они менялись местами.
Уже гораздо лучше. Однако и здесь есть свои проблемы. При балансировке нагрузки
между процессорам необходимо время от времени производить миграцию процессов с
одного процессора на другой. Для этого приходится блокировать очередь работы
одного процессора другим.
Также имелись и проблемы с честным выделением ресурсов пользователям. Если один
запустит 10 процессов, а другой 1, то разделение времени будет нечестым.
В ядре 2.6.23 появился новый планировщик CFS — Completely Fair Scheduler
(полностью честный планировщик). Он уже оперирует не процессами, а сущностями
планирования () — появилась возможность честнее разделять время
между пользователями. Сам планировщик стал выделять время ближе к приоритетам.
Алгоритм стал несколько “дороже” — O(logN) — используется красно-чёрное дерево,
что с ростом количества процессов заметно всё меньше и меньше. Планирование из
одной структуры данных организовано довольно оптимально — для работы на
многопроцессорных системах подходит также лучше. Именно он сейчас используется в
Linux.
Помимо планировщиков общего назначения в Linux есть и планировщик для систем
реального времени
Это системы, в которых важно, чтобы время
реакции системы на внешний сигнал не превышало определённого времени. К примеру,
от момента определения заноса до запуска сервоприводов тормозных колодок должно
пройти не более 5мс
Помимо планировщика на работу влияют и многие другие части
ОС, например, буферы, обработчики прерываний и т.д. Однако, и планировщик и
программы должны быть специальными для работы в реальном времени.
Так в Linux используется с алгоритмом планирования по
ближайшему сроку завершения (EDF — Earliest deadline first):
- планировщик ведёт список процессов, отсортированный по сроку завершения (deadline);
- в работу берётся готовый процесс, имеющий самый близкий deadline;
- при появлении нового процесса — пересортировка.
Программы же должны при запуске указывать через параметры
, и — время исполнения в худшем случае, срок
завершения и период.
Общие задачи
Эти вопросы не являются специфическими для Bash, но достаточно часто встречаются в этом теге, поэтому они заслуживают включения в этот список.
- Слишком длинный список аргументов для команд rm, cp, mv
- Редактирование / замена содержимого нескольких файлов в Unix AIX, не открывая его или поиск / замена скриптов, так что вам не нужно вручную открывать файл и редактировать его
- Быстрый способ поиска строк в одном файле, которых нет в другом?
- Как удалить дубликаты строк в файле, не сортируя его в Unix?
- Внутреннее объединение двух текстовых файлов
- Заменить поле значениями, указанными в другом файле
- Заменить строку в сценарии оболочки, используя переменную
- Проверьте количество запущенных скриптов, используя ps
- Получить строку после символа
- Извлечь одно слово после определенного слова в той же строке
- Как получить часть файла после первой строки, которая соответствует регулярному выражению?
- Извлечь строки между 2 токенами в текстовом файле, используя bash
- Разбор JSON с инструментами Unix
- Фильтрация записей файла журнала на основе диапазона дат
- Как сделать рекурсивный поиск / замену строки с помощью awk или sed?
- Как выполнить группу команд от имени другого пользователя в Bash?
- Несколько команд на удаленном компьютере с использованием сценария оболочки
- Как разбить большой текстовый файл на более мелкие файлы с одинаковым количеством строк?
- CronJob не запущен, crontabтакже содержит хороший набор примечаний для устранения неполадок .
Книги и Ресурсы
Дополнительные материалы для чтения включают в себя:
-
FAQ по Bashтекущего основного сопровождающего, Чет Рами.
-
FAQ по Bashот Lhunath
-
Руководство по Bashот Lhunath
-
Ускоренный курс командной строки(также ссылка на Powershell)
Написание функций Bash
Сначала нужно понять что такое функция в нашем контексте. Функция — это набор команд, объединенных одним именем, которые выполняют определенную задачу. Функция вызывается по ее имени, может принимать параметры и возвращать результат работы. Одним словом, функции Bash работают так же, как и в других языках программирования.
Синтаксис создания функции очень прост:
имя_функции() { список_команд }
Имя функции не должно совпадать ни с одной из существующих команд или функций, а все команды в теле функции пишутся с новой строки.
Простая функция
Давайте напишем небольшую функцию, которая будет выводить строку на экран:
$ vi function.sh
#!/bin/bash
printstr(){
echo «hello world»
}
printstr
Вызов функции bash выполняется указанием ее имени, как для любой другой команды. Запустите наш скрипт на выполнение, не забывайте, что перед этим нужно дать ему права на выполнение:
Все работает, теперь усложним задачу, попробуем передать функции аргументы.
Аргументы функции
Аргументы функции нужно передавать при вызове, а читаются они точно так же, как и аргументы скрипта. Синтаксис вызова функции с параметрами bash такой:
имя_функции аргумент1 аргумент2 … аргументN
Как видите, все достаточно просто. Параметры разделяются пробелом. Теперь улучшим нашу функцию, чтобы она выводила заданную нами строку:
Можно сделать, чтобы параметров было несколько:
Есть и другой способ извлекать аргументы, как в Си, с помощью стека. Мы извлекаем первый аргумент, затем сдвигаем указатель стека аргументов на единицу и снова извлекаем первый аргумент. И так далее:
Возврат результата функции
Вы можете не только использовать функции с параметрами bash, но и получить от нее результат работы. Для этого используется команда return. Она завершает функцию и возвращает числовое значение кода возврата. Он может быть от 0 до 255:
Если вам нужно применить возврат значения функции bash, а не статус код, используйте echo. Строка не сразу выводится в терминал, а возвращается в качестве результата функции и ее можно записать в переменную, а затем использовать:
Экспорт функций
Вы можете сделать функцию доступной вне скрипта с помощью команды declare:
Затем запустите скрипт с помощью команды source:
Рекурсия
Вы можете вызвать функцию из нее же самой, чтобы сделать рекурсию:
Вы можете поэкспериментировать с использованием рекурсии, во многих случаях это может быть полезным, только не забывайте делать первый вызов функции Bash.
Локальные переменные в функции
Если вы объявите обычную переменную в функции, то она будет доступной во всем скрипте, это удобно для возврата значения функции, но иногда может понадобиться сделать локальную переменную. Для этого существует команда local:
Библиотеки функций
Мы можем взять некоторые функции bash и объединить их в одну библиотеку, чтобы иметь возможность одной командой импортировать эти функции. Это делается похожим образом на экспорт функций. Сначала создадим файл библиотеки:
test1(){
echo «Hello World from 1»;
}
test2(){
echo «Hello World from 2»;
}
test3(){
echo «Hello World from 3»;
}
Теперь создадим скрипт, который будет использовать наши функции. Импортировать библиотеку можно с помощью команды source или просто указав имя скрипта:
Создание постоянных алиасов
Для создания постоянных алиасов, которые не будут удаляться после перезагрузки терминала, необходимо записать их в специальный скрытый файл — , который представляет собой обычный bash-скрипт исполняемый каждый раз при открытии терминала.
Так как — текстовый файл, то его можно отредактировать в любом текстовом редакторе, я буду использовать редактор gedit, вы же можете использовать удобный для вас редактор будь то nano, vim или любой другой.
Для начала редактирования выполните команду ниже:
В самом конце файла добавьте нужный вам алиас и сохраните изменения. Каждый новый алиас должен начинаться с новой строки.
Добавление алиасов в файл .bashrc
Однако сразу после сохранения алиас работать не будет, так как для применения новых настроек нужно заново выполнить файл . Для этого либо просто перезагрузите консоль или выполните обновление настроек с помощью следующей команды:
Теперь ваш только что добавленный алиас будет выполняться.
Важно чтобы рядом со знаком — не было пробелов, т.е. такая запись недопустима -. Не забывайте, что вы из-за незнания какой либо команды можете переопределить ее алиасом
Так, например, если создать алиас — , то вместо попытки создания каталога с помощью команды , в консоли будет выполняться алиас, который в нашем случае, будет показывать сообщение — «wrong alias!»
Не забывайте, что вы из-за незнания какой либо команды можете переопределить ее алиасом. Так, например, если создать алиас — , то вместо попытки создания каталога с помощью команды , в консоли будет выполняться алиас, который в нашем случае, будет показывать сообщение — «wrong alias!».
Смена контекста (context switch)
Само собой, при смене контекста производится много работы. Часть из неё
мы уже описали выше, но особого внимания заслуживает отдельный момент,
который мы ещё не обсуждали.
Кеш процессора
Современные компьютеры много сложнее, чем процессор-шина-память. В частности,
для ускорения работы этой связки был добавлен ещё один вид памяти, который
расположен ближе к процессору, чем RAM — кеш процессора. Размер кеша меньше, чем
памяти. Однако, редко какая программа оперирует всей памятью сразу. Обычно
необходимые для работы программы данные лежат вместе и их размер невелик.
Именно благодаря этому небольшая память кеша, но низкое время обращения
процессора к ней, и даёт значительный прирост производительности на многих
задачах. С другой стороны — при переключении контекстов в кеше может не хватать
места под оперативные данные всех процессов — тогда кеш будет обновляться (также
говорят “прогреваться”) из памяти по мере необходимости. И это может сильно
замедлить работу компьютера по сравнению с работой при горячем кеше.
В следующем примере мы запустим программу в 8 потоков на 8-ми ядрах. Они будут
увеличивать общий счётчик до довольно большого числа. Так как они будут
параллельно обрабатывать одни и те же данные, компьютер будет постоянно
синхронизировать кеши.
Сборка:
Для примера, если запустить эту же программу но на одном ядре (пусть и в 8
потоков) — смены контекста также будут происходить, но кеш будет “горячим” —
программа выполнится быстрее. Для запуска на определённых процессорах программ
(или миграции) используется утилита (или программно
).
Посмотреть же статистическую информацию о смене контекстов за секунду можно всё
также в . Столбик system, раздел “cs” (от “context switch”).
Вступление
В Bash имеется множество встроенных проверок и сравнений, что очень удобно во многих ситуациях. Вы, наверное, видели, если такие заявления раньше:
if ; then
Условие в этом примере по сути является командой. Это может звучать странно, но сравнение с квадратными скобками аналогично использованию встроенной команды , например:
if test $foo -ge 3; then
Если $foo больше(G) или равно(E) 3, блок после «then» будет выполнен. Если вы всегда задавались вопросом, почему bash использует или вместо >= или ==, это потому, что этот тип условия исходит из команды, где и — параметры.
И это то, что по сути, проверяет состояние завершения команды. Я объясню это более подробно далее в руководстве.
Также есть встроенные проверки, которые более специфичны для оболочек.
if ; then
Вышеуказанное условие выполняется, если файл «regularfile» существует и
это обычный файл. Обычный файл означает, что это не блок или
символьное устройство или каталог. Таким образом, вы можете быть уверены, что
Файл существует, прежде чем что-то делать с ним. Вы даже можете проверить, если
файл читабелен!
if ; then
Приведенное выше условие выполняется, если файл «readablefile» существует и доступен для чтения. Легко, не правда ли?
Двойные скобки
Результат выполнения команды можно легко сохранить в переменную.
На основе этого механизма можно выполнять арифметические действия. Достаточно вместо одной пары скобок использовать две.
Рассмотрим примеры в скрипте
expansion_example.sh
Разберём этот скрипт:
Строка 4 — Базовый синтаксис. Можно ставить пробелы без использования кавычек.
Строка 7 — Работает и без пробелов.
Строка 10 — Можно использовать переменные без $ перед ними.
Строка 13 — А можно и с $
Строка 16 — Увеличение переменной на 1. Символ $ не нужен.
Строка 19 — Увеличение переменной на 3. Это краткая форма записи b = b + 3.
Строка 19 — В отличие от других способов символ * не нужно экранировать.
./expansion_example.sh
981112131620
Двойные скобки дают довольно много свободы в форматировании кода.
Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.
Различные синтаксисы условий
Bash имеет различные синтаксисы для условий. Я перечислю три из них:
1. Синтаксис с одной скобкой
Это синтаксис условия, который вы уже видели в предыдущих параграфах; это самый старый поддерживаемый синтаксис. Он поддерживает три типа условий:
-
Файловые условия
Позволяет различные виды проверок. Пример:
if ; then
Приведенное выше условие верно, если файл символическая ссылка существует и является символической ссылкой. Дополнительные условия для файлов см. в таблице ниже. -
Строковые условия
Позволяет проверять строку и сравнивать строки. Пример первый:
if ; then
Вышеуказанное условие истинно, если $emptystring является пустой строкой или неинициализированной переменной. Пример два:
if ; then
Приведенное выше условие истинно, если $stringvar1 содержит только строку «cheese». Дополнительные условия на основе строк см. в таблице ниже. -
Арифметические (числовые) условия
Позволяет сравнивать целые числа. Пример:
if ; then
Приведенное выше условие возвращает true, если $num меньше 1. Более подробные арифметические условия см. в таблице ниже.
2. Синтаксис в двойных скобках
Возможно, вы уже столкнулись с условиями, заключенными в двойные квадратные скобки, которые выглядят так:
if ]; then
Синтаксис двойной скобки служит расширенной версией синтаксиса одной скобки; он в основном имеет те же особенности, но и некоторые важные различия с ним. Я перечислю их здесь:
Первое отличие_ можно увидеть в приведенном выше примере; при сравнении строк в синтаксисе двойных скобок используется глобализация оболочки(shell globbing). Это означает, что звездочка («*») расширится буквально до чего угодно, как вы, вероятно, знаете из обычного использования командной строки. Поэтому, если $stringvar где-либо содержит фразу «string», условие вернет true. Допускаются и другие формы срыва оболочки
Если вы хотите сопоставить и строку «String», и строку «string», вы можете использовать следующий синтаксис:
if tring* ]]; then
Обратите внимание, что допускается только общее глобирование оболочки. Такие Bash-специфичные вещи, такие как {1..4} или {foo, bar}, не будут работать
Также обратите внимание, что глобирование не будет работать, если вы экранировали кавычками правую строку. В этом случае вы должны оставить его без кавычек.
Второе отличие — это то, что разделение слов предотвращено. Следовательно, вы можете опустить размещение кавычек вокруг строковых переменных и без проблем использовать условие, подобное следующему:
if ]; then
Тем не менее, цитирование строковых переменных остается хорошей привычкой, поэтому я рекомендую просто продолжать это делать.
Третье отличие состоит в том, что имена файлов не расширяются. Я проиллюстрирую это различие на двух примерах, начиная со старой ситуации с одной скобкой:
if ; then
Вышеуказанное условие вернет true, если в рабочем каталоге есть один файл с расширением .sh. Если их нет, он вернет false. Если есть несколько файлов .sh, bash выдаст ошибку и прекратит выполнение скрипта. Это связано с тем, что *.sh распространяется на файлы в рабочем каталоге. Использование двойных скобок предотвращает это:
if ]; then
Приведенное выше условие вернет true, только если в рабочем каталоге есть файл с именем «*.sh», независимо от того, какие существуют другие файлы .sh. Звездочка взята буквально, потому что синтаксис в двойных скобках не расширяет имена файлов.
Четвертое отличие — это добавление более общеизвестных объединяющих выражений или, более конкретно, операторов «&&» и «||». Пример:
if ]; then
Приведенное выше условие возвращает true, если $num равно 3, а $stringvar равно «foo». Также поддерживаются -a и -o, известные из синтаксиса с одной скобкой.
Обратите внимание, что оператор and имеет приоритет над оператором or, что означает, что «&&» или «-a» будет оцениваться перед «||» или «-о».
3. Синтаксис с двойными скобками
Существует также другой синтаксис для арифметических (основанных на числах) условий, наиболее вероятно взятый из оболочки Korn:
if (( $num <= 5 )); then
Приведенное выше условие выполняется, если $num меньше или равно 5. Этот синтаксис может показаться программистам более знакомым. Он включает в себя все «нормальные» операторы, такие как ==, <-> и =>. Он поддерживает комбинирующие выражения «&&» и «||» (но не выражения -a и -o!). Это эквивалентно встроенной команде let.
Типы командных оболочек
В *nix-системах существует два основных типа оболочек: оболочки на основе Bourne shell и оболочки на основе C shell.
Типичными представителями оболочек типа Bourne shell являются:
sh (Bourne shell)
bash (Bourne Again shell)
ksh (Korn shell)
zsh (Z Shell)
К оболочкам типа C Shell относятся:
csh (C shell)
tcsh (TENEX/TOPS C shell)
Ниже представлены некоторые из самых распространенных шеллов, используемых в *nix-системах:
Примечание: Термин «*nix-системы» обозначает -подобные операционные системы.
sh (Bourne shell)
sh (сокр. от Bourne shell») — это самая старая (среди рассматриваемых) оболочка, написанная Стивеном Борном из AT&T Bell Labs для ОС UNIX v7. Оболочка доступна практически в любом *nix-дистрибутиве. Многие другие шеллы уходят своими корнями именно к sh. Благодаря своей скорости работы и компактности, данная оболочка является предпочтительным средством для написания shell-скриптов. К её недостаткам можно отнести отсутствие функций для использования оболочки в интерактивном режиме, а также отсутствие встроенной обработки арифметических и логических выражений.
Примечание: Стоит отметить, что из-за общего морального устаревания оболочки, в современных системах ссылка на шелл sh (/bin/sh), обычно, является псевдонимом для запуска текущей, более новой оболочки.
Характерные черты sh:
Полные пути к интерпретатору: /bin/sh и /sbin/sh.
Приглашение для обычного пользователя: .
Приглашение для суперпользователя (root): .
bash (Bourne-Again shell)
bash (сокр. от Bourne–Again shell») — это усовершенствованный и дополненный вариант шелла sh, является одной из самых популярных современных командных оболочек *nix-систем.
Совместим с sh.
Объединяет в себе полезные фишки оболочек ksh и csh.
Поддерживает навигацию при помощи стрелок, благодаря чему можно просматривать историю команд и выполнять редактирование прямо в командной строке.
Характерные черты bash:
Полный путь к интерпретатору: /bin/bash.
Приглашение для обычного пользователя: (где — это домашний каталог текущего пользователя, например, ).
Приглашение для суперпользователя (root): .
ksh (Korn shell)
ksh (сокр. от Korn shell) — это командная оболочка, разработанная Дэвидом Корном из AT&T Bell Labs в 1980-x годах.
Является расширением sh.
Имеет обратную совместимость с sh.
Имеет интерактивный функционал, сравнимый с csh.
Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений/функций, Си-подобный синтаксис скриптов и средства для работы со строками.
Работает быстрее, чем csh.
Может запускать скрипты, написанные для sh.
Характерные черты ksh:
Полный путь к интерпретатору: /bin/ksh.
Приглашение для обычного пользователя: .
Приглашение для суперпользователя (root): .
csh (C shell)
csh (сокр. от C shell) — это командная оболочка, созданная Биллом Джоем (автором редактора vi) с целью усовершенствования стандартного шелла Unix (sh).
Имеет встроенные функции для интерактивного использования, например, псевдонимы (aliases) и историю команд.
Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений и Cи-подобный синтаксис скриптов.
Характерные черты csh:
Полный путь к интерпретатору: /bin/csh.
Приглашение для обычного пользователя: .
Приглашение для суперпользователя (root): .
tcsh (TENEX C Shell)
tcsh (сокр. от TENEX C shell) — это командная оболочка, созданная Кэном Гриром, которая позиционируется как улучшенная версия шелла csh.
Имеет полную совместимость csh.
Именно в данном шелле впервые появилась функция автодополнения команд и путей.
Удобна для интерактивной работы.
Поддерживает редактор командной строки в стиле vi или emacs.
Является стандартным шеллом во FreeBSD.
Характерные черты tcsh:
Полный путь к интерпретатору: /bin/tcsh.
Приглашение для обычного пользователя: .
Приглашение для суперпользователя (root): .
zsh (Z Shell)
zsh (сокр. от Z shell) — это командная оболочка, созданная Паулем Фалстадом во время его учебы в Принстонском университете, позиционируется как свободная современная sh-совместимая командная оболочка.
Среди стандартных шеллов больше всего похожа на ksh, но включает в себя множество улучшений.
Встроенная поддержка программируемого автодополнения команд, имен файлов и пр.
Поддержка проверки орфографии и опечаток.
Раздельная история команд для одновременной работы с несколькими запущенными шеллами.
Характерные черты zsh:
Полный путь к интерпретатору: /bin/zsh.
Приглашение для обычного пользователя: .
Приглашение для суперпользователя (root): .
Внутренние и внешние команды оболочки
Вводимые пользователем команды делятся на два типа:
Внутренние — это команды, изначально встроенные в оболочку.
Внешние — это команды, которые не встроены в оболочку. По своей сути они являются скорее небольшими отдельными программами, расположенными где-то в файловой системе (обычно, в каталогах /bin или /usr/bin).
Чтобы определить тип команды, достаточно в окне терминала ввести :
Как вы можете видеть, команды , , и — являются внутренними командами оболочки bash. А вот команды , и — являются внешними, т.к. они ссылаются на соответствующие файлы в каталоге /usr/bin.
Ознакомиться с полным списком внутренних команд оболочки можно при помощи команды :
Иллюзия многозадачности
В частности, наша система станет однозадачной. Ведь никакой многозадачности нет
(особенно, если мы рассматриваем однопроцессорную систему). Однако, потребность
в этом есть: на компьютере могут работать несколько пользователей одновременно,
а каждый пользователь хочет запустить несколько задач.
Поэтому нам нужно сделать из однозадачной системы иллюзию многозадачной.
Для этого мы поделим время работы процессора между всеми задачами.
Точнее — поделим всё время работы на небольшие части, а в эти небольшие части
(time slice), в которые будем исполнять то одну задачу, то другую.
Если делать это очень быстро — создаётся иллюзия параллельной обработки
нескольких задач одновременно.
И тут появляется планировщик
Возникает логичный вопрос: а кто будет заниматься созданием иллюзии
многозадачности? Какая-то программа для управления программами
(этакая мета-программа) — как раз планировщик. Причём от него зависит довольно
многое — на сколько хорошо будет работать иллюзия параллельного исполнения
множества процессов.
Поэтому наша программа-планировщик должна стараться раздавать имеющиеся кванты
времени “справедливо”. При этом понятие “справедливо” — тоже довольно обширное.
К примеру, пользователь будет недоволен, если воспроизведение фильма будет
подвисать, при этом не сильно расстроится, если фоновая задача будет
притормаживать.
Плюсом к этому будет грустно, если задача распределения ресурсов процессора
будет съедать сильно много процессорного времени — неприятно, когда управленцы
получают больше, чем исполнители.
Также важно помнить, что пользователю важен отклик системы.
Поэтому планировщик должен быть привязан как-то к реальному времени. И тут есть множество проблем для планировщика
Так, к примеру, нельзя
определить, когда программа дойдёт до определённого момента
(идеальный момент для переключения) чисто по алгоритмическим причинам
И тут есть множество проблем для планировщика. Так, к примеру, нельзя
определить, когда программа дойдёт до определённого момента
(идеальный момент для переключения) чисто по алгоритмическим причинам.
К слову, может быть кто-то знает альтернативные подходы к реализации вычислительных систем, не процессор-шина-память?
Что-то может пойти не так и какая-то программа зависнет — что тут делать,
как решать, что нужно передать управление, что делать с этой программой?
Опять же, понять, что она реально зависла для произвольной программы мы не можем…
И тут остаётся использовать те самые аппаратные прерывания.
Если программа сама не передаёт управление — через прерывание таймера мы можем
понять, что время пришло переключить управление. Ну и в целом — можно
по таймеру следить за “справедливостью” выделения процессорного времени.
На него ориентироваться при планировании исполнения процессов.