Unix bash: Оболочка Bash — шпаргалка для начинающих
Оболочка Bash — шпаргалка для начинающих
В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.
Оболочка Bash: введение
Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.
Навигация
В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.
pwd
Команда pwd
, сокращение от print working directory, отображает текущее местоположение в структуре каталогов.
cd
Команда cd
позволяет перейти в новый каталог.
Синтаксис | Объяснение |
---|---|
cd | Перемещение в домашний каталог |
cd ~ | Перемещение в домашний каталог |
cd .. | Перемещение на один уровень выше |
cd - | Перемещение в предыдущий каталог |
cd Directory1 | Перемещение в каталог Directory1 |
cd Directory1/Directory2 | Перемещение в каталог Directory2 по указанному пути |
mkdir
Команда mkdir
создаёт новый каталог в текущем каталоге.
Основные команды
man
Команда man
отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat
:
$ man cat
cat
Команда cat
считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.
echo
Команда echo
выводит свои аргументы по стандартному каналу вывода.
$ echo Hello World
Hello World
Если вызвать echo
без аргументов, будет выведена пустая строка.
head
Команда head
читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:
$ head -50 test.txt
tail
Команда tail
работает аналогично команде head
, но читает строки с конца:
$ tail -50 test.txt
Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f
:
$ tail -f test.txt
less
Команда less
позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.
$ less test.txt
$ ps aux | less
Подробнее о назначении символа | будет рассказано ниже в разделе команды history
.
Обычные сочетания клавиш | Описание |
---|---|
G | Перемещает в конец файла |
g | Перемещает в начало файла |
:50 | Перемещает на 50 строку файла |
q | Выход из less |
/searchterm | Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки |
/ | Перемещает на следующий подходящий результат поиска |
?searchterm | Поиск строки, совпадающей с ‘searchterm’, выше текущей строки |
? | Перемещает на следующий подходящий результат поиска |
up | Перемещает на одну строку выше |
down | Перемещает на одну строку ниже |
pageup | Перемещает на одну страницу выше |
pagedown | Перемещает на одну страницу ниже |
true
Команда true
всегда возвращает ноль в качестве выходного статуса для индикации успеха.
false
Команда false
всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.
$?
$?
— это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):
$ true
$ echo $?
0
$ false
$ echo $?
1
grep
Команда grep
занимается поиском переданной строки в указанном файле:
$ cat users.txt
user:student password:123
user:teacher password:321
$ grep 'student` file1.txt
user:student password:123
grep
также может принимать несколько файлов и регулярных выражений для уточнения формата текста.
Обычные флаги | Описание |
---|---|
-i | Отключение чувствительности к регистру |
-r | Рекурсивный поиск по директориям |
-w | Поиск только целых слов |
-c | Вывод количества найденных элементов |
-n | Вывод всей строки, содержащей запрос |
-v | Вывод инвертированного совпадения |
Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.
sed
Команда sed
— это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g
. Например, следующий код заменит все слова «Hello» на «Hi»:
$ cat test. txt
Hello World
$ sed 's/Hello/Hi/g' test.txt
Hi World
Также вы можете ознакомиться с руководством по sed.
history
Команда history
выводит историю командной строки. Обычно её используют вместе с командой grep
для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++
:
$ history | grep g++
155 g++ file1.txt
159 g++ file2.txt
Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history
прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history
, но увидим вывод команды grep
.
Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls
, history
, ps
(описана ниже), перенаправляя их вывод в grep
, sed
или less
, например.
export
Команда export
устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name
со значением student
:
$ export name=student
ps
Команда ps
выводит информацию о запущенных процессах.
$ ps
PID TTY TIME CMD
35346 pts/2 00:00:00 bash
Выводится четыре элемента:
- ID процесса (PID),
- тип терминала (TTY),
- время работы процесса (TIME),
- имя команды, запустившей процесс (CMD).
awk
Команда awk
находит и заменяет текст в файлах по заданному шаблону: awk 'pattern {action}' test.txt
wget
Команда wget
скачивает файлы из Сети и помещает их в текущий каталог.
$ wget https://github.com/mikeizbicki/ucr-cs100
nc
Команда nc
— это утилита для отладки сети. Также можно ознакомиться с руководством по nc.
ping
Команда ping
тестирует сетевое подключение.
$ ping google.com
PING google.com (74.125.224.34) 56(84) bytes of data.
64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms
Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.
git
Git
— это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.
Переменные окружения
Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.
Переменная PATH
содержит список каталогов, в которых система ищет исполняемые файлы.
Переменная HOME
содержит путь к домашнему каталогу текущего пользователя.
Коннекторы
Коннекторы позволяют запускать несколько команд одновременно.
Коннектор | Описание |
---|---|
&& | Первая команда исполняется всегда, вторая — только в случае успешного завершения первой |
|| | Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой |
; | Команды исполняются всегда |
$ true && echo Hello
Hello
$ false || echo Hello
Hello
$ echo Hello ; ls
Hello
test.txt file1.txt file2.txt
Конвейеры
Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls
будет передан в head
, и в результате будет напечатано лишь 10 первых элементов.
$ ls -l | head
Перенаправление ввода/вывода
Перенаправление вывода
Для стандартного перенаправления вывода используются символы >
и >>
.
Например, этот код передаст вывод ls
в файл, а не на экран:
$ ls > files.txt
$ cat files.txt
file1.cpp sample.txt
Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >>
— она дописывает данные в конец файла.
Перенаправление ввода
Для стандартного перенаправления вывода используется символ <
. В следующем примере sort
берет входные данные из файла, а не с клавиатуры:
$ cat files.txt
c
b
$ sort < files.txt
b
c
Команда sort
выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:
$ sort < files.txt > files_sorted.txt
Продвинутое перенаправление
Добавление &
к >
приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp
выведет строку stdout
в cout
и строку stderr
в cerr
.
$ g++ test.cpp
$ ./a.out >& test.txt
$ cat test.txt
stdout
stderr
Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к >
.
Имя | Дескриптор | Описание |
---|---|---|
stdin | 0 | Стандартный поток ввода |
stdout | 1 | Стандартный поток вывода |
stderr | 2 | Стандартный поток вывода ошибок |
Например, для перенаправления stderr
в test. txt
нужно сделать следующее:
$ g++ test.cpp
$ ./a.out 2> test.txt
stdout
$ cat test.txt
stderr
Права доступа
Команда ls -l
выводит много информации о правах доступа к каждому файлу:
$ ls -l test.txt
-rw-rw-r-- 1 user group 1097374 January 26 2:48 test.txt
Вывод в примере | Описание / возможные выводы |
---|---|
— | Тип файла:- файлd каталог |
rw- | Права доступа владельца файла |
rw- | Права доступа членов группы-владельца файла |
r– | Права доступа прочих пользователей |
user | Имя владельца файла |
group | Имя группы-владельца файла |
chmod
Команда chmod
изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:
Буква | Пользователь |
---|---|
u | Владелец |
g | Член группы |
o | Прочие пользователи |
a | Все пользователи |
Вы можете вызвать chmod
с описанием действий над конкретным файлом. Символ -
обозначает удаление прав, символ +
— добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:
$ chmod ug+rw test.txt
$ ls -l test.txt
-rw-rw---- 1 user group 1097374 January 26 2:48 test.txt
Кроме того, chmod
можно использовать с восьмеричными числами, где 1
— это наличие прав, а 0
— отсутствие:
rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4
Следующая команда сработает так же, как и предыдущая:
$ chmod 660 test. txt
Также можно ознакомиться с руководством по правам доступа.
Сочетания клавиш
Сочетание | Описание |
---|---|
CTRL-A | Перемещение курсора в начало строки |
CTRL-E | Перемещение курсора в конец строки |
CTRL-R | Поиск по истории |
CTRL-W | Вырезать последнее слово |
CTRL-U | Вырезать всё до курсора |
CTRL-K | Вырезать всё после курсора |
CTRL-Y | Вернуть последнюю вырезанную строку |
CTRL-_ | Отмена |
CTRL-L | Очистка экрана терминала |
Не смешно? А здесь смешно: @ithumor
По материалам Bash-Cheatsheet
Введение в Linux и Bash. Курс
Курс «Введение в Linux и Bash» – серия статей-уроков, знакомящих с историей, особенностями и философией операционных систем GNU/Linux, принципами работы в режиме командной строки и основными командами, выполняемыми в Bash.
Курс будет полезен начинающим пользователям операционной системы GNU/Linux, будущим системным администраторам и веб-разработчикам, планирующим самостоятельно развертывать сайты на веб-серверах.
История Linux
В статье кратко рассматриваются предпосылки возникновения операционной системы Linux и ее развитие: историческая значимость Unix, роль проекта GNU, как появилось ядро Linux и многообразие дистрибутивов.
GNU GPL
GNU GPL — одна из разновидностей копилефт-лицензий для свободного программного обеспечения. GPL есть аббревиатура от General Public License — Универсальная Общественная Лицензия. В статье рассматриваются исторические причины появления копилефт-лицензий и преимущества открытого ПО.
Ядро Linux
В статье описано, что такое ядро операционной системы, особенности Unix-подобных ядер, в том числе Linux.
Каталоги Linux
Структура каталогов Linux отличается от Windows. В Linux на самом верхнем уровне файловой иерархии находится один единственный корневой каталог, обозначаемый косой чертой «/» (слэш). Другие диски монтируются в /media.
Типы файлов Linux
Типы файлов Linux: обычные файлы (-), каталоги (d), символьные ссылки (l), символьные (c) и блочные (b) устройства, каналы (p) и сокеты (s). В Linux расширение файла не несет информации для ОС о типе файла.
Интерфейс командной строки
Интерфейс командной строки — иной, отличный от графического режима, способ работы в операционной системе, при котором команды отдаются с помощью их ввода с клавиатуры. Исторически CLI возник раньше GUI.
Bash – командная оболочка Linux
Bash — это наиболее распространенная командная оболочка для Linux. Bash позволяет работать в интерфейсе командной строки операционной системы, отдавая команды в интерактивном режиме.
Параметры команд
Команды Bash могут содержать параметры. Ключи, или опции, модифицируют работу программы. Аргументы, или операнды, — то, над чем выполняется команда.
Ctrl + C, Ctrl + D, Ctrl + Z
В терминале Ctrl + C и Ctrl + D прерывают работу программ, Ctrl + Z — останавливает и переводит в фоновый режим. Чтобы сделать фоновую задачу текущей, используется команда fg. Для удаления процессов — команда kill.
История команд и автодополнение
В Bash история команд прокручивается стрелками вверх и вниз, для автозавершения команд и адресов используется Tab — клавиша табуляции.
Перенаправление ввода-вывода
В Bash с помощью знака больше «>» вывод команды можно перенаправить в файл. С помощью знака меньше изменяется стандартный поток ввода.
Документация Linux
В Bash доступ к документации программ GNU/Linux можно получить с помощью программ man, info, ключа —help. Man-страницы имеют строгую структуру, info — неофициальная документация.
Абсолютная и относительная адресация. Команда cd
Для перехода по дереву каталогов в Bash используется команда cd, которая в качестве аргумента принимает абсолютный или относительный адрес каталога.
Команда ls – просмотр каталога
Команда ls используется в командной оболочке Linux для вывода содержимого каталогов и информации о файлах. У программы ls есть много ключей, позволяющих получать о файлах более подробную информацию, а также выводить ее в различных форматах.
Копирование, перемещение, создание и удаление файлов и каталогов
В командной оболочке Bash команда cp копирует файл, mv — перемещает и переименовывает, mkdir — создает каталог, rm — удаляет. При копировании и перемещении сначала указывается источник, потом место назначения.
Жесткие и символьные ссылки
В Linux каждый файл идентифицируется числовым индексным дескриптором. Имена файлов указывают на дескрипторы и являются жесткими ссылками. Символьные ссылки указывают на жесткие ссылки.
Создание ссылок в Linux
В командной оболочке Linux жесткие ссылки на файлы создаются с помощью команды ln. Для создания символьных ссылок на файлы и каталоги используется команда ln -s.
Права доступа
В Unix-подобных ОС для файлов устанавливаются биты прав доступа на чтение, изменение и выполнение по отношению к трем категориям: владельцу, группе и остальным.
Команда chmod – изменение прав доступа
С помощью команды chmod изменяют права доступа к файлам и каталогам. Может использоваться как символьный, так и числовой способ назначения прав.
Шаблоны имен файлов
В шаблонах имен файлов любое количество любых символов обозначается звездочкой *. Любой один символ — знаком вопроса ?. Если надо задать только определенные допустимые символы, то используются квадратные скобки [].
Поиск файлов. Команда find
В Bash поиск файлов выполняется командой find. Сначала указывается каталог, потом свойство и его значение. Например, find . -name «*.html» ищет файлы html в текущем каталоге.
Команда sudo – администрирование системы
Утилита sudo позволяет выполнить команду с правами администратора системы. В Bash сначала пишется sudo, затем команда и ее параметры.
Пакетный менеджер APT
В Linux установка программ выполняется с помощью пакетных менеджеров. Наиболее популярным является apt. Команда установки: apt install. Команда удаления: apt remove.
Команда source в Bash
Команда source читает и выполняет команды из файла, указанного в качестве аргумента в текущей среде оболочки. Полезно загружать функции, переменные и файлы конфигурации в сценарии оболочки.
source это оболочка, встроенная в Bash и другие популярные оболочки, используемые в операционных системах Linux и UNIX. Его поведение может немного отличаться от оболочки к оболочке.
Синтаксис исходной команды
Синтаксис команды source следующий:
source FILENAME [ARGUMENTS] . FILENAME [ARGUMENTS]
- source и .(точка) – это одна и та же команда.
- Если FILENAME путь к файлу не полный, команда выполнит поиск файла в каталогах, указанных в переменной среды $PATH. Если файл не найден в команде $PATH, будет выполнен поиск файла в текущем каталоге.
- Если ARGUMENTS они заданы, они станут позиционными параметрами для FILENAME.
- Если FILENAME существует sourceкод завершения команды 0, в противном случае, если файл не найден, он вернется 1.
Примеры команды source
В этом разделе мы рассмотрим некоторые основные примеры использования команды source.
Функции поиска
Если у вас есть сценарии оболочки, использующие те же функции, вы можете извлечь их в отдельный файл, а затем получить этот файл в своих файлах.
В этом примере мы создадим файл, который включает в себя функцию bash, которая проверяет, является ли пользователь, выполняющий скрипт, пользователем root, и, если нет, показывает сообщение и завершает работу скрипта.
functions.sh
check_root () { if [[ $EUID -ne 0 ]]; then echo "Этот сценарий должен выполняться от имени root" exit 1 fi }
Теперь в каждом из ваших сценариев, которые должны запускаться только пользователем root, просто создайте файл functions.sh и вызовите функцию:
#!/usr/bin/env bash source functions.sh check_root echo "я root"
Если вы запустите приведенный выше сценарий как пользователь без полномочий root, он напечатает «Этот сценарий должен быть запущен от имени пользователя root» и завершится.
Преимущество этого подхода состоит в том, что ваши скрипты будут меньше и более читабельны, вы можете повторно использовать один и тот же файл функций при необходимости, и если вам нужно изменить функцию, вы отредактируете только один файл.
Конфигурационный файл Bash
С помощью команды source вы также можете читать переменные из файла. Переменные должны быть установлены с использованием синтаксиса VARIABLE=VALUE в Bash.
Давайте создадим тестовый файл конфигурации:
config.sh
В вашем bash-скрипте используйте команду source для чтения файла конфигурации:
#!/usr/bin/env bash source config.sh echo "VAR1 is $VAR1" echo "VAR2 is $VAR2"
Если вы запустите скрипт, результат будет выглядеть так:
Заключение
Из этой статьи вы узнали, как использовать sourceвстроенную команду в сценариях оболочки.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Linux / Unix: “-bash: python: command not found”
Предположим я новичок и пытаюсь запустить программу на Python. У меня есть облако на основе VM / VPS и когда я запускаю mycode.py на терминале моего сервера, я получаю следующее сообщение об ошибке:
-bash: Python: команда не найдена
Как решить эту проблему?
Эта ошибка означает, что Python либо не установлен или ваша установка повреждена. Вот как вы можете решить эту проблему.
Проверьте путь питона
Введите одну из команд для проверки существования бинарного файла pyrhon на Linux / Unix
type -a python
или
ls -l /usr/bin/python ls -l /usr/bin/python*
или
which python
Пример результата
Кажется, что Python отсутствует по неизвестной причине или не был установлен провайдером, чтобы сэкономить дисковое пространство. Как установить его в соответствии с вашим дистрибутивом Linux или Unix вариант:
Ubuntu / Debian / Mint Linux установка Python
Ввкдите следующую команду apt-get или apt
$ sudo apt-get install python
Или установить версию пиона 3:
$ sudo apt-get install python3
Oracle / RHEL (Red Hat) / CentOS Linux установить Python
Введите следующую команду :
$ sudo yum install python
Fedora Linux установить Python
Введите следующую команду DNF, чтобы добавить v2.x Python:
$ sudo dnf install python
ИЛИ добавить Python v3.x:
$ sudo dnf install python3
Arch Linux установка Python
Введите следующую команду pacman, чтобы добавить v2.x Python:
$ sudo pacman -S python2
ИЛИ добавить v3.x Python:
$ sudo pacman -S python3
Suse / OpenSUSE Linux установка Python
Введите следующую команду, чтобы добавить v2.x Python:
$ sudo zypper install python
ИЛИ добавить v3.x Python:
$ sudo zypper install python3
FreeBSD Unix установка Python
Введите следующую команду PKG, чтобы добавить v2. x Python:
# pkg install python2
ИЛИ Чтобы установить порт Python V2.x:
# cd /usr/ports/lang/python2/ && make install clean
Для того, чтобы добавить пакет Python v3.x:
# pkg install python3
ИЛИ Чтобы установить порт Python v3.x:
# cd /usr/ports/lang/python3/ && make install clean
OpenBSD Unix установка Python
Введите следующую команду pkg_add, чтобы добавить v2.x Python или 3.x:
# pkg_add python
ИЛИ
$ doas pkg_add python
Примеры результатов:
quirks-2.241 signed on 2016-07-26T16:56:10Z Ambiguous: choose package for python a 0: 1: python-2.7.12 2: python-3.4.5 3: python-3.5.2 Your choice:
MacOS X Unix установка python3
Введите следующую команду:
$ brew install python3
Проверка правильности установки Python
Введите следующие команды:
$ type -a python $ which python $ ls -l /usr/bin/python $ ls -l /usr/bin/python*
Примеры результатов:
Примечание о сломанном линке
Иногда символические ссылки на исполняемые файлы питонов ломаются по какой-то причине. Например, /usr/bin/python3.4 это реальные исполняемые файлы. Вы можете указать/usr/bin/python на /usr/bin/python3.4 для Python версии 3.4 с помощью команды LN:
$ sudo ln -s /usr/bin/python3.4 /usr/bin/python
Теперь вы можете запустить программу:
$ python mycode.py
Предоставляем услуги администрирования серверов и DevOps инженеров
|
|
|
|
|
|
Что такое Bash? | Opensource.com
Когда компьютер загружается, ядро (будь то Linux, BSD, Mach или NT) распознает все физическое оборудование и позволяет каждому компоненту взаимодействовать друг с другом и управлять им с помощью некоторого базового программного обеспечения. Самый простой набор инструкций компьютера просто поддерживает его включенным и в безопасном состоянии: периодическая активация вентиляторов для предотвращения перегрева, использование подсистем для мониторинга дискового пространства или «прослушивания» новых подключенных устройств и т. Д.Если бы это были все компьютеры, они были бы столь же интересны, как конвекционная печь.
Ученые-компьютерщики осознали это рано, поэтому они разработали оболочку для компьютеров Unix, которая работает вне ядра (или вокруг ядра , как оболочка в природе) и позволяет людям взаимодействовать с компьютером, когда они хотят . Это было захватывающим событием в то время, когда люди загружали в компьютеры перфокарты, чтобы указывать им, что делать. Из всех доступных оболочек Bash — одна из самых популярных, самых мощных и дружелюбных.
Bash — это приложение
Когда вы запускаете терминал (например, терминал GNOME или Konsole в Linux или iTerm2 в macOS) с оболочкой Bash, вас встречает приглашение . Подсказка — это символ, обычно знак доллара ( $ ), указывающий, что оболочка ожидает вашего ввода. Конечно, совсем другое дело — знать, что вы должны печатать.
Это, вероятно, покажется недружелюбным, но на самом деле это очень сжатое представление множества коннотаций, связанных с термином «Bash.«Для многих новых пользователей нет разделения между концепцией Bash и концепцией Linux или Unix: это пресловутый черный экран с зеленым текстом, в который вы должны закодировать то, что ваш компьютер сделает дальше. Это объединяет оболочка Bash с командами , которые вы вводите в оболочку. Важно понимать, что это две разные вещи: Bash — это просто приложение, и его основная задача — запускать других приложений (в форме команд) которые установлены в одной системе.
[Загрузите нашу бесплатную шпаргалку по Bash]
Вы можете изучить Bash, но только в контексте изучения операционной системы, в которой он работает. Не зная команд, с Bash мало что можно сделать.
Команды Linux
В Linux и Unix (например, BSD и macOS) большинство команд по умолчанию хранятся в системных каталогах, таких как / usr / bin и / bin . По своей природе Bash знает эти команды не больше, чем вы, естественно, знаете клингонский диалект, но так же, как вы можете искать клингонские слова, Bash может искать команды.Когда вы вводите команду для Bash, он ищет определенные каталоги в вашей системе, чтобы узнать, существует ли такая команда. Если команда существует, Bash выполняет ее.
Bash также является командой, и обычно это команда по умолчанию, выполняемая, когда вы открываете окно терминала или входите в текстовую консоль. Чтобы узнать, где находится какая-либо команда в вашей системе, включая Bash, вы можете использовать команду , которая в терминале:
$ который bash
/ usr / bin / bash
$ который ls
/ usr / bin / ls
В Bash встроено несколько команд.Большинство встроенных команд относятся к сценариям Bash или параметрам низкоуровневой среды, но некоторые из них универсально полезны, например, cd (для изменить каталог ). Встроенные команды не отображаются, когда вы их ищете, потому что они не существуют в вашем обычном исполняемом пути:
$ который bash
который: нет компакт-диска в (/ usr / local / bin: / usr / bin: / bin:
[...]
Они все еще доступны, потому что они встроены в Bash, а Bash — это то, что вы используете.
Запуск Bash
Большинство современных дистрибутивов Linux и Unix по умолчанию предоставляют оболочку Bash. Они делают это, потому что Bash хорошо известен и имеет несколько удобных функций, которых нет в других оболочках. Однако в некоторых системах по умолчанию используется другая оболочка. Чтобы узнать, используете ли вы оболочку Bash, вы можете использовать команду echo вместе со специальной переменной, представляющей имя текущего запущенного процесса:
Если вы не используете Bash, но хотите его попробовать, вы, вероятно, можете загрузить и установить Bash из своего программного центра, репозитория программного обеспечения или дерева портов.Или вы можете использовать Chocolatey в Windows или Homebrew в macOS. Если ничего не помогает, посетите домашнюю страницу Bash для получения дополнительной информации.
Работа в Bash
Bash — это законный интерфейс для вашего компьютера, и он предназначен не только для администраторов серверов и программистов. Это может быть рабочий стол, текстовый редактор, приложение для редактирования графики и многое, многое другое. Некоторые люди используют Bash больше, чем настольные приложения.
Существуют сотни команд для Linux и Unix, и вы можете удивиться, насколько они разнообразны.x800 \
-Центр тяжести \
-crop 1600×800 + 0 + 0 myphoto.jpg
Вы можете воспроизводить музыку с помощью таких команд, как ogg123 или mpg321 , конвертировать аудио с sox , настраивать и редактировать видео с помощью ffmpeg , редактировать текст с помощью emacs или vim , проверять электронную почту с сосна или mutt , просматривайте Интернет с помощью elinks , просматривайте файлы с помощью ranger или midnightcommander и многое, многое другое.Все это делается в Bash с помощью команд, которые вы найдете в своей системе или в репозитории программного обеспечения.
Bash скрипты
Одна из причин, по которой Bash (и Linux в целом) считается настолько мощным, заключается в том, что он поддерживает сценарии. Все, что вы можете ввести в Bash вручную, вы также можете перечислить в текстовом файле и запустить его за вас. Вместо того, чтобы тратить полдня на ручное выполнение сотни команд, вы можете написать сценарий команд и заставить ваш компьютер выполнять их, пока вы будете заниматься более важными делами.Поскольку почти все в Linux работает поверх оболочки Bash, почти все в Linux можно создать с помощью сценария Bash. Хотя есть исключения из этого правила (например, графические приложения могут иметь свой собственный язык сценариев или вообще не иметь сценариев), создание сценариев для вашей ОС открывает десятки тысяч возможных функций, которые вы можете реализовать на своем компьютере, не выполняя их самостоятельно.
Невозможно оценить объем работы, которую это экономит пользователям Linux каждый день. Однако разница не в обычной автоматизации; это индивидуальные рабочие процессы, которые люди изобретают для себя, вещи, которые, по мнению других, нуждаются в автоматизации.
Когда опытные пользователи говорят, что хотят изучить Bash, если они не имеют в виду, что хотят изучать команды Linux, они, вероятно, имеют в виду, что они хотят улучшить способ написания своих команд. Например, это крайне рудиментарный сценарий Bash, который преобразует временный файл (представьте, что это файл, созданный отдельным процессом) в определенный каталог:
#! / Usr / bin / bashcp tmp.png ~ / public_html / `date +% Y% m% d`.png
Это правильный Bash.Вы можете проверить это, скопировав и вставив команду (последняя строка, начинающаяся с cp ) в терминал. Пока есть файл с именем tmp.png и каталог с именем ~ / public_html , команда работает.
Однако
Learning Bash — это понимание того, как можно улучшить такую простую команду для автоматизации. Например, если файл tmp.png не существует, сценарий завершается ошибкой. Если этот сценарий является ключевым компонентом, например, для сайта блогов, которому каждый день требуется новое изображение, чтобы можно было создать настраиваемое изображение заголовка, то сбой сценария может вызвать катастрофические ошибки в другом месте. Пользователь, знакомый с Bash, может повысить отказоустойчивость, используя синтаксис Bash:
.
#! / Usr / bin / bashIMG = "tmp.png"
[[-e tmp.png]] || IMG = "generic.png"
cp ~ / "$ {IMG}" ~ / public_html / `date +% Y% m% d`.png
Это всего лишь один пример процесса обучения написанию сценариев с помощью Bash, но он демонстрирует, как изучение Linux и Bash одинаково полезно и не является полностью отдельными задачами.
Преимущества Bash
Bash так же мощен, как и другие оболочки, но добавляет вспомогательные функции, такие как двойные скобки ( [[ и ]] ) в примере кода.Эти «башизмы» очень нравятся пользователям Bash, потому что они избегают иногда многословного и неудобного синтаксиса в других оболочках, таких как tcsh или ash. Однако они уникальны для Bash и не совместимы с POSIX, что может вызвать проблемы совместимости в системах, на которых не работает Bash. Опять же, Bash — это бесплатное программное обеспечение с открытым исходным кодом, поэтому большинство пользователей могут установить его, если оно им нужно. Отсутствие совместимости только вызывает дополнительную зависимость и никого не исключает из использования сценария.
Learning Bash
Если вы хотите изучить Bash, вы можете прочитать любое количество замечательных книг по этой теме.
Или вы можете пройти онлайн-курс на EdX.org и даже присоединиться к некоторым бесплатным курсам Red Hat.
Лучше всего то, что вы также можете играть в игры, чтобы изучить Bash.
Удачи и удачи!
Сценарии оболочки — оболочка Unix
Обзор
Обучение: 30 мин.
Упражнения: 15 мин.Цели
Напишите сценарий оболочки, который запускает команду или серию команд для фиксированного набора файлов.
Запустить сценарий оболочки из командной строки.
Напишите сценарий оболочки, который работает с набором файлов, определенным пользователем в командной строке.
Создавайте конвейеры, включающие сценарии оболочки, написанные вами и другими.
Мы, наконец, готовы увидеть, что делает оболочку такой мощной средой программирования.
Мы собираемся брать команды, которые мы часто повторяем, и сохранять их в файлах.
так что мы можем повторно запустить все эти операции позже, набрав одну команду.По историческим причинам
набор команд, сохраненных в файле, обычно называется сценарием оболочки ,
но не заблуждайтесь:
это на самом деле небольшие программы.
Давайте начнем с того, что вернемся к молекулам /
и создадим новый файл, middle.sh
, который будет
стать нашим сценарием оболочки:
$ cd молекул
$ nano middle.sh
Команда nano middle.sh
открывает файл middle.sh
в текстовом редакторе «nano»
(который работает внутри оболочки).Если файл не существует, он будет создан.
Мы можем использовать текстовый редактор для непосредственного редактирования файла — мы просто вставим следующую строку:
head -n 15 octane.pdb | хвост -n 5
Это вариант трубы, которую мы построили ранее:
он выбирает строки 11-15 файла octane.pdb
.
Помните, что мы , а не , пока запускаем его как команду:
мы помещаем команды в файл.
Затем сохраняем файл ( Ctrl-O
в нано),
и выйдите из текстового редактора ( Ctrl-X
в nano).Убедитесь, что в каталоге Molecules
теперь есть файл с именем middle.sh
.
После того, как мы сохранили файл,
мы можем попросить оболочку выполнить содержащиеся в ней команды.
Наша оболочка называется bash
, поэтому мы запускаем следующую команду:
АТОМ 9 H 1 -4,502 0,681 0,785 1,00 0,00
АТОМ 10 H 1 -5,254 -0,243 -0,537 1,00 0,00
АТОМ 11 H 1 -4,357 1,252 -0,895 1,00 0,00
АТОМ 12 Ч 1 -3.009 -0,741 -1,467 1,00 0,00
АТОМ 13 H 1 -3,172 -1,337 0,206 1,00 0,00
Конечно же,
вывод нашего сценария — это именно то, что мы получили бы, если бы запустили этот конвейер напрямую.
Текст против чего угодно
Обычно мы называем такие программы, как Microsoft Word или LibreOffice Writer «текстовыми.
редакторы », но нам нужно быть немного осторожнее, когда дело доходит до
программирование. По умолчанию Microsoft Word используетфайлов .docx
для хранения не
только текст, но также информацию о форматировании шрифтов, заголовков и т. д.
на.Эта дополнительная информация не хранится в виде символов и не означает
что-нибудь для таких инструментов, какhead
: они ожидают, что входные файлы будут содержать
ничего, кроме букв, цифр и знаков препинания на стандартном компьютере
клавиатура. Поэтому при редактировании программ вы должны либо использовать простой
текстовый редактор или сохраняйте файлы как обычный текст.
Что, если мы хотим выбрать строки из произвольного файла?
Мы можем редактировать middle.sh
каждый раз, чтобы изменить имя файла,
но это, вероятно, займет больше времени, чем повторный ввод команды
в оболочке и запустив его с новым именем файла.Вместо этого давайте отредактируем middle.sh
и сделаем его более универсальным:
Теперь в «nano» замените текст octane.pdb
специальной переменной под названием $ 1
:
головка -н 15 "1 $" | хвост -n 5
Внутри сценария оболочки,
$ 1
означает «первое имя файла (или другой аргумент) в командной строке».
Теперь мы можем запустить наш скрипт следующим образом:
$ bash middle.sh octane.pdb
ATOM 9 H 1-4.502 0,681 0,785 1,00 0,00
АТОМ 10 H 1 -5,254 -0,243 -0,537 1,00 0,00
АТОМ 11 H 1 -4,357 1,252 -0,895 1,00 0,00
АТОМ 12 H 1 -3,009 -0,741 -1,467 1,00 0,00
АТОМ 13 H 1 -3,172 -1,337 0,206 1,00 0,00
или в другом файле, например:
$ bash middle.sh pentane.pdb
ATOM 9 H 1 1,324 0,350 -1,332 1,00 0.00
АТОМ 10 H 1 1,271 1,378 0,122 1,00 0,00
АТОМ 11 H 1 -0,074 -0,384 1,288 1,00 0,00
АТОМ 12 H 1 -0,048 -1,362 -0,205 1,00 0,00
АТОМ 13 H 1 -1,183 0,500 -1,412 1,00 0,00
Двойные кавычки вокруг аргументов
По той же причине, по которой мы помещаем переменную цикла в двойные кавычки,
если в имени файла есть пробелы,
мы заключаем$ 1
в двойные кавычки.
В настоящее время нам нужно редактировать middle.sh
каждый раз, когда мы хотим настроить диапазон
строки, которые возвращаются.
Давайте исправим это, настроив наш скрипт на использование трех аргументов командной строки.
После первого аргумента командной строки ( $ 1
) каждый дополнительный аргумент, который мы
provide будет доступен через специальные переменные $ 1
, $ 2
, $ 3
,
которые относятся к первому, второму и третьему аргументам командной строки соответственно.
Зная это, мы можем использовать дополнительные аргументы для определения диапазона строк для
передается на головку
и хвост
соответственно:
голова -n "2 доллара" "1 доллар" | tail -n "$ 3"
Теперь мы можем запустить:
$ bash middle.sh pentane.pdb 15 5
АТОМ 9 H 1 1,324 0,350 -1,332 1,00 0,00
АТОМ 10 H 1 1,271 1,378 0,122 1,00 0,00
АТОМ 11 Ч 1 -0.074 -0,384 1,288 1,00 0,00
АТОМ 12 H 1 -0,048 -1,362 -0,205 1,00 0,00
АТОМ 13 H 1 -1,183 0,500 -1,412 1,00 0,00
Изменяя аргументы нашей команды, мы можем изменить наш скрипт
поведение:
$ bash middle.sh pentane.pdb 20 5
АТОМ 14 H 1 -1,259 1,420 0,112 1,00 0,00
АТОМ 15 H 1 -2,608 -0,407 1,130 1,00 0,00
АТОМ 16 H 1-2.540 -1,303 -0,404 1,00 0,00
АТОМ 17 H 1 -3,393 0,254 -0,321 1,00 0,00
ТЕР 18 1
Это работает,
но следующему человеку, который прочитает middle.sh
, может потребоваться мгновение, чтобы понять, что он делает.
Мы можем улучшить наш скрипт, добавив комментариев вверху:
# Выбрать строки из середины файла.
# Использование: bash middle.sh имя_файла end_line num_lines
голова -n "$ 2" "$ 1" | tail -n "$ 3"
Комментарий начинается с символа #
и продолжается до конца строки.Компьютер игнорирует комментарии,
но они бесценны, поскольку помогают людям (в том числе и вам в будущем) понимать и использовать сценарии.
Единственное предостережение: каждый раз, когда вы изменяете скрипт,
вы должны проверить правильность комментария:
объяснение, которое направляет читателя в неверном направлении, хуже, чем его отсутствие.
Что, если мы хотим обрабатывать много файлов в одном конвейере?
Например, если мы хотим отсортировать наши файлы .pdb
по длине, мы должны ввести:
, потому что wc -l
перечисляет количество строк в файлах
(напомним, что wc
означает «количество слов», добавление опции -l
вместо этого означает «подсчет строк»)
и sort -n
сортирует вещи численно.Мы могли бы поместить это в файл,
но тогда он будет отсортировать только список из файлов .pdb
в текущем каталоге.
Если мы хотим получить отсортированный список файлов других типов,
нам нужен способ включить все эти имена в сценарий.
Мы не можем использовать $ 1
, $ 2
и т. Д.
потому что мы не знаем, сколько там файлов.
Вместо этого мы используем специальную переменную $ @
,
что значит,
«Все аргументы командной строки для сценария оболочки».
Мы также должны заключить $ @
в двойные кавычки.
для обработки случая аргументов, содержащих пробелы
( "$ @"
— это специальный синтаксис, эквивалентный "$ 1"
"$ 2"
…).
Вот пример:
# Сортировка файлов по длине.
# Использование: bash sorted.sh one_or_more_filenames
wc -l "$ @" | sort -n
$ bash sorted.sh * .pdb ../creatures/*.dat
9 methane.pdb
12 ethane.pdb
15 пропан.pdb
20 cubane.pdb
21 pentane.pdb
Октановое число 30.pdb
163 ../creatures/basilisk.dat
163 ../creatures/minotaur.dat
163 ../creatures/unicorn.dat
596 Всего
Список уникальных видов
У Леи есть несколько сотен файлов данных, каждый из которых имеет следующий формат:
05.11.2013, олень, 5 2013-11-05, кролик, 22 2013-11-05, енот, 7 2013-11-06, кролик, 19 2013-11-06, Олень, 2 2013-11-06, лиса, 1 2013-11-07, кролик, 18 2013-11-07, медведь, 1
Пример файла этого типа приведен в
data-shell / data / animal-counts / animals.txt
.Мы можем использовать команду
cut -d, -f 2 animals.txt | сортировать | uniq
для создания уникальных видов животных в.txt
. Чтобы избежать необходимости каждый раз вводить эту серию команд, ученый может вместо этого написать сценарий оболочки.Напишите сценарий оболочки с именем
sizes.sh
, который принимает любое количество
имена файлов в качестве аргументов командной строки и использует вариант приведенной выше команды для печати списка уникальных видов, появляющихся в каждом из этих файлов отдельно.Решение
# Скрипт для поиска уникальных видов в файлах csv, где вид - второе поле данных # Этот скрипт принимает любое количество имен файлов в качестве аргументов командной строки # Перебрать все файлы для файла в $ @ делать echo "Уникальные виды в $ file:" # Извлечь названия видов вырезать -d, -f 2 $ файл | сортировать | уникальный сделано
Предположим, мы только что выполнили ряд команд, которые сделали что-то полезное, например,
которые создали график, который мы хотели бы использовать в статье.Мы хотели бы иметь возможность воссоздать график позже, если нам понадобится,
поэтому мы хотим сохранить команды в файле.
Вместо того, чтобы вводить их снова
(и потенциально ошибаюсь)
мы можем это сделать:
$ история | хвост -n 5> повторить-figure-3.sh
Файл redo-figure-3.sh
теперь содержит:
297 bash goostats NENE01729B.txt stats-NENE01729B.txt
298 bash goodiff stats-NENE01729B.txt /data/validated/01729.txt> 01729-sizes.txt
299 cut -d ',' -f 2-3 01729-разницы.txt> 01729-time-series.txt
300 ygraph --format scatter --color bw --borders none 01729-time-series.txt figure-3.png
301 история | хвост -n 5> повторить-figure-3.sh
После минутной работы в редакторе над удалением серийных номеров команд,
и чтобы удалить последнюю строку, в которой мы вызвали команду history
,
у нас есть совершенно точная запись того, как мы создали эту фигуру.
Зачем записывать команды в историю перед их запуском?
Если вы запустите команду:
$ история | хвост -n 5> недавний.ш
последняя команда в файле — это сама команда
history
, т.е.
оболочка добавилаисторию
в журнал команд до того, как
запустил это. На самом деле оболочка всегда добавляет команды в журнал
перед их запуском. Как вы думаете, почему он это делает?Решение
Если команда вызывает сбой или зависание, это может быть полезно
чтобы узнать, что это была за команда, чтобы исследовать проблему.Если бы команда записывалась только после ее выполнения, мы бы не
иметь запись последней команды, запущенной в случае сбоя.
На практике большинство людей разрабатывают сценарии оболочки, выполняя команды в приглашении оболочки несколько раз.
чтобы убедиться, что они поступают правильно,
затем сохраните их в файле для повторного использования.
Такой стиль работы позволяет людям перерабатывать
что они узнают о своих данных и своем рабочем процессе с помощью одного звонка на номер история
и немного редактирования, чтобы очистить вывод
и сохраните его как сценарий оболочки.
Конвейер Нелле: создание сценария
Начальник Нелле настаивал на том, чтобы все ее аналитические данные были воспроизводимы. Самый простой способ зафиксировать все шаги — в сценарии.
Сначала мы вернемся в каталог данных Нелле:
$ cd ../north-pacific-gyre/2012-07-03/
Она запускает редактор и пишет следующее:
# Вычислить статистику для файлов данных.
для файла данных в "$ @"
делать
echo $ datafile
bash goostats $ datafile stats- $ datafile
сделано
Она сохраняет это в файле под названием do-stats.sh
так что теперь она может повторно провести первый этап своего анализа, набрав:
$ bash do-stats.sh NENE * [AB] .txt
Она также может это сделать:
$ bash do-stats.sh NENE * [AB] .txt | туалет -l
, чтобы на выходе было просто количество обработанных файлов.
а не имена обработанных файлов.
Следует отметить, что в сценарии Нелле
он позволяет пользователю решать, какие файлы обрабатывать.
Она могла бы написать это как:
# Рассчитать статистику для файлов данных сайта A и сайта B.для файла данных в NENE * [AB] .txt
делать
echo $ datafile
bash goostats $ datafile stats- $ datafile
сделано
Преимущество в том, что при этом всегда выбираются правильные файлы:
ей не нужно помнить об исключении файлов «Z».
Недостаток в том, что всегда выбирает только эти файлы — она не может запустить его для всех файлов.
(включая файлы «Z»),
или в файлах «G» или «H», которые создают ее коллеги в Антарктиде,
без редактирования скрипта.
Если бы она хотела быть более предприимчивой,
она могла изменить свой сценарий, чтобы проверить аргументы командной строки,
и используйте NENE * [AB].txt
, если ничего не было предоставлено.
Конечно, это означает еще один компромисс между гибкостью и сложностью.
Переменные в сценариях оболочки
Представьте, что в каталоге
молекул
у вас есть сценарий оболочки с именемscript.sh
, содержащий
следующие команды:голов -н $ 2 $ 1 хвост -n $ 3 $ 1
Находясь в каталоге
Molecules
, вы набираете следующую команду:сценарий bash.sh '* .pdb' 1 1
Какой из следующих результатов вы ожидаете увидеть?
- Все строки между первой и последней строками каждого файла, заканчивающиеся на
.pdb
вмолекулах
каталоге- Первая и последняя строки каждого файла, заканчивающиеся на
.pdb
в каталогемолекул
- Первая и последняя строка каждого файла в каталоге
молекул
- Ошибка из-за кавычек около
*.pdb
Решение
Правильный ответ — 2.
Специальные переменные $ 1, $ 2 и $ 3 представляют аргументы командной строки, передаваемые
скрипт, так что выполняются следующие команды:$ напор -n 1 кубан.pdb этан.pdb октан.pdb пентан.pdb пропан.pdb $ tail -n 1 cubane.pdb ethane.pdb octane.pdb pentane.pdb propane.pdb
Оболочка не расширяет
'* .pdb'
, потому что он заключен в кавычки.Таким образом, первый аргумент сценария —'* .pdb'
, который раскрывается в пределах
скрипт отголова
и хвост.
Найти самый длинный файл с заданным расширением
Напишите сценарий оболочки с именем
longest.sh
, который берет имя
каталог и расширение имени файла в качестве аргументов и печатает
из имени файла с наибольшим количеством строк в этом каталоге
с этим расширением. Например:$ bash самый длинный.ш / тмп / данные PDB
напечатает имя файла
.pdb
в/ tmp / data
, который имеет
самые строки.Решение
# Сценарий оболочки, который принимает два аргумента: # 1. имя каталога # 2. расширение файла # и печатает имя файла в этом каталоге # с наибольшим количеством строк, соответствующих расширению файла. туалет -l $ 1 /*.$ 2 | sort -n | хвост -n 2 | голова -n 1
Первая часть трубопровода,
сан.узел-1 $ / *.$ 2 | sort -n
, считает
строки в каждом файле и сортирует их по номерам (самый большой последний). Когда
имеется более одного файла,wc
также выводит итоговую итоговую строку,
что дает общее количество строк в всех файлах. Используем хвост, чтобы выбросить эту последнюю строку.
-n 2 | head -n 1С унитазом
-l $ 1 /*.$ 2 | sort -n | tail -n 1
мы увидим окончательную сводку
line: мы можем построить наш конвейер по частям, чтобы убедиться, что мы понимаем
выход.
Понимание чтения сценария
Для ответа на этот вопрос рассмотрим еще раз каталог
data-shell / modules
.
Он содержит рядфайлов .pdb
в дополнение к любым другим файлам, которые вы
возможно создали.
Объясните, что будет делать каждый из следующих трех сценариев при запуске от имени
bash script1.sh * .pdb
,bash script2.sh * .pdb
иbash script3.sh * .pdb
соответственно.# Скрипт 2 для имени файла в $ 1 $ 2 $ 3 делать cat $ filename сделано
Решения
В каждом случае оболочка расширяет подстановочный знак до
*.pdb
перед передачей результирующего
список имен файлов в качестве аргументов скрипта.Сценарий 1 распечатает список всех файлов, в имени которых есть точка.
Аргументы, переданные в скрипт, фактически нигде в скрипте не используются.Сценарий 2 распечатает содержимое первых 3 файлов с расширением
.pdb
.
$ 1
,$ 2
и$ 3
относятся к первому, второму и третьему аргументу соответственно.Сценарий 3 распечатает все аргументы сценария (т.е.е. все файлы
.pdb
),
за которым следует.pdb
.
$ @
относится к всем аргументам, передаваемым сценарию оболочки.cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb.pdb
Сценарии отладки
Предположим, вы сохранили следующий сценарий в файле с именем
do-errors.sh
в Nelle’snorth-pacific-круговорот / 2012-07-03
каталог:# Вычислить статистику для файлов данных.для файла данных в "$ @" делать echo $ datfile bash goostats $ datafile stats- $ datafile сделано
При запуске:
$ bash do-errors.sh NENE * [AB] .txt
вывод пустой.
Чтобы выяснить, почему, повторно запустите скрипт с параметром-x
:bash -x do-errors.sh NENE * [AB] .txt
Что вам показывает вывод?
Какая строка отвечает за ошибку?Решение
Параметр
-x
заставляетbash
работать в режиме отладки.Это распечатывает каждую команду по мере ее выполнения, что поможет вам найти ошибки.
В этом примере мы видим, чтоecho
ничего не печатает. Мы допустили опечатку
в имени переменной цикла, а для переменнойфайл данных
не существует, поэтому возвращается
пустая строка.
Ключевые моменты
Сохранение команд в файлах (обычно называемых сценариями оболочки) для повторного использования.
bash [имя файла]
запускает команды, сохраненные в файле.
$ @
относится ко всем аргументам командной строки сценария оболочки.
$ 1
,$ 2
и т. Д. Относятся к первому аргументу командной строки, второму аргументу командной строки и т. Д.Поместите переменные в кавычки, если в значениях могут быть пробелы.
Предоставление пользователям возможности решать, какие файлы обрабатывать, является более гибким и более согласованным со встроенными командами Unix.
Bash Scripting: все, что вам нужно знать о программировании на Bash-оболочке | Удай Хиварале | Системный сбой
Язык сценариев Bash имеет гораздо больше функций и вещей, о которых нужно беспокоиться. Вот некоторые вещи, на которые следует обратить внимание и чему следует научиться.
1. Псевдонимы в Bash
Мы можем создать псевдоним команды, используя команду alias
. Например, чтобы получить более подробный список файлов, мы используем команду ls -alh
. Мы можем сократить его, определив псевдоним ll
, как показано ниже.
~ $ псевдоним ll = "ls -alh"
~ $ ll ⥤
drwxr-xr-x 11 Uday.Hiwarale staff 352B 7 сен 20:10.
drwxr-xr-x 4 Uday.Hiwarale Staff 128B 4 сен 06:38 ..
-rw-r - r - @ 1 Uday.Hiwarale Staff 6.0K 6 сен 12:45 photo.txt
2.
команда типа
тип
— это встроенная команда оболочки для просмотра типа ключевого слова или команды.
https://gist.github.com/thatisuday/1365d0e0be1d086799697db4bd18a62c
3.Одновременное выполнение нескольких команд
Bash дает нам возможность запускать несколько команд одновременно. Вы могли использовать &&
, чтобы объединить две команды для одновременного запуска. Посмотрим другие варианты.
# &&: Выполнить следующую команду, если предыдущая команда выполнена успешно
true && echo "1: Напечатано"
false && echo "1: Это не будет напечатано" # || : Выполнять команды до тех пор, пока одна из них не будет успешной
false || echo "2: Распечатано"
true || echo «2: Это не будет напечатано» # ; : Выполнить все команды (только разделитель операторов)
false; echo «2A: напечатано»
true; echo «2B: напечатано» ⥤ 1: напечатано
⥤ 2: напечатано
⥤ 2A: напечатано
⥤ 2B: напечатано
Мы можем передать STDOUT
команды STDIN
другой команды, используя |
оператор.Например, STDOUT
of ls -alh * Команда
может быть передана команде less
, когда мы выполняем ls -alh * | минус
выписка.
💡 для получения дополнительной информации о команде
меньше
выполните командуменьше
на своем терминале.man
— это также команда, которая предоставляет manual команды, распространяемой в UNIX-подобных операционных системах.
~ $ ls -alh * | минус ⥤
Заявки:
всего 16
drwx ------ @ 5 сотрудников Uday 160B 31 августа 18:15.
drwxr-xr-x + 31 персонал Uday 992B 9 сентября 17:16 ..
-rw-r - r - @ 1 персонал Uday 6.0K 31 августа 18:16 .DS_Store
-rw-r - r-- @ 1 персонал Uday 0B 28 августа, 16:23 .localized
drwx ------ @ 11 Персонал Uday 352B 4 сентября 23:03 Chrome Apps.localizedCreative Cloud Files:
, всего 47936
drwxrwxr-x @ 14 сотрудников Uday 448B сен 8 00:46.
drwxr-xr-x + 31 персонал Uday 992B 9 сентября 17:16 ..
-rw-r - r - @ 1 персонал Uday 0B 8 сентября 00:43 Icon
-rw-r - r-- 1 Uday Staff 707K 11 июл 00:44 пост-1.png
-rw-r - r-- 1 персонал Uday 1.6M 11 июля 00:44 post-2.ai
-rw-r - r-- 1 персонал Uday 716K 15 июля 21:07 post-3-01 .png
-rw-r - r-- 1 сотрудник Uday 1.7M 15 июля 21:07 post-3.ai
-rw-r - r-- 1 сотрудник Uday 756K 20 июля 23:28 post-4- 01.png
-rw-r - r-- 1 Uday Staff 1.7M Jul 20 23:28 post-4.ai
: ▐
Основная цель передачи вывода ls -alh *
на меньше
предназначен для предотвращения команды ls
для сброса на терминал слишком большого количества информации, которую терминал не может обработать.Используя приведенную выше команду, мы можем передать вывод ls
до минус
и минус
позволит нам прочитать этот вывод по одной или нескольким строкам за раз.
По сути, STDIN
, STDERR
и STDOUT
являются потоками, что означает, что они похожи на каналы, по которым текут данные. Они всегда открыты, и любая программа может передавать данные через них. Любой, кому нравится терминальная оболочка, слушающая эти потоки, будет получать данные всякий раз, когда кто-то отправляет через нее.
|
называется оператором pipe , потому что он соединяет два потока и передает данные из одного потока в другой. Например, он может соединить STDOUT
программы с STDIN
другой программы. So |
in ls -alh * | минус
в основном подключение STDOUT
от ls
до STDIN
или меньше.
Если команда запускает непрерывно выполняющуюся программу, такую как бесконечный цикл и
, и эта программа передает данные другой команде, соединение между STDOUT
и STDIN
остается открытым.Это может быть опасно по нескольким причинам. Например, если программа, получающая непрерывный поток данных от другой программы, не может потреблять достаточно быстро, буфер канала в конечном итоге будет заполнен.
Давайте создадим простой бесконечно работающий цикл while
, который печатает случайное число, что означает отправку в поток STDOUT
. Но вместо того, чтобы печатать его напрямую на терминал, мы перенаправим или перенаправим вывод на команду минус
, которая будет читать его по одной строке за раз.
(, а true; do sleep 1; echo $ RANDOM; done ) | меньше
Вышеупомянутая программа никогда не завершится, поскольку цикл while работает постоянно. Однако в этом случае, поскольку оператор конвейера соединяет выходной поток левой программы с входным потоком из минус
, и он остается подключенным навсегда, всякий раз, когда левая программа отправляет данные через выходной поток , он попадает во входной поток минус
и минус
выводит его на STDOUT
, который является нашей терминальной консолью .
Если мы хотим записать выходной поток команды в файл, мы можем использовать оператор >
AKA оператор перенаправления . Это перезапишет содержимое файла, если файл уже существует, иначе будет создан новый файл.
echo "Hello"> random.txt
cat random.txt⥤ Hello echo "World"> random.txt
cat random.txt⥤ World
Если вы хотите добавить вывод команду в файл, используйте вместо этого >>
.
echo "Hello" >> random.txt # также добавляет новую строку
cat random.txt⥤ Hello echo "World" >> random.txt # также добавляет новую строку
cat random.txt⥤
Hello
World
Если вы пишете вывод команды, запускающей бесконечно работающую программу, канал между файлом STDIN
и STDOUT
программы останется открытым. Любые данные, отправленные в STDIN
, будут непрерывно добавляться в файл.
Мы также можем использовать оператор <
, который аналогичен >
, но перенаправляет содержимое файла команде. Типичный синтаксис варианта использования будет выглядеть как команда < file.txt
, что означает отправку данных файла file.txt
в команду
.
~ $ catHello
World
До сих пор мы имели дело с
STDOUT
, но если нам нужен потокSTDERR
, есть&>
и& >>
синтаксис для него.Это очень хорошо объясняется в ответе .
4. Переменные среды
Переменная оболочки - это переменная, определенная внутри сценария Bash. Когда вы исходите из внешнего сценария Bash, переменные, определенные внутри внешнего сценария Bash, будут доступны внутри текущего сценария Bash. Это короткоживущих переменных.
Переменные среды также являются переменной Bash, но определяются с помощью команды export
. Давайте рассмотрим небольшой пример определения такой переменной.
# env-test.sh
export MY_IP = '192.168.1.7'
echo «Мой IP: $ MY_IP» ----------------- -------------- ~ $ bash env-test.sh
⥤ Мой IP: 192.168.1.7
Когда мы используем команду export
, Bash регистрирует эту переменную и сохраняет в пространстве имен текущего сеанса терминала и созданных им подсессий ( подпроцессов, ). Чтобы увидеть список всех доступных переменных среды, мы используем команду printenv
.
~ $ printenv ⥤ TERM_PROGRAM = vscode
⥤ TERM = xterm-256color
...
⥤ HOME = / Users / Uday.Hiwarale
Но из приведенного выше результата мы не можем увидеть наш MY_IP
переменная. Как было сказано ранее, переменные среды доступны только внутри текущего сеанса и созданных им подсессий. Поскольку команда bash
запускает сценарий в отдельном сеансе, переменная среды будет создана там и уничтожена в конце.
# env-test.sh
экспорт MY_IP = '192.168.1.7'
printenv ------------------------------- ~ $ bash env-test.sh
⥤ MY_IP = 192.168.1.7
⥤ TERM_PROGRAM = vscode
⥤ TERM = xterm-256color
...
⥤ HOME = / Users / Uday.Hiwarale
Как видно из приведенные выше результаты, переменная окружения MY_IP
существует внутри сеанса, запущенного командой bash env-test.sh
.
Основное назначение среды - установить глобальные значения для подпроцессов ( подсессий, ), созданных основным сценарием Bash.Давайте посмотрим на пример.
# child.sh
echo "LOCAL_VAR внутри child.sh: $ LOCAL_VAR"
echo "MY_IP внутри child.sh: $ MY_IP" # main.sh
LOCAL_VAR = "MAIN4" export MY_IP = '192.168.1.7'
bash ./child.sh # запускает подсеанс ------------------------ ------- ~ $ bash main.sh
⥤ LOCAL_VAR внутри child.sh:
⥤ MY_IP внутри child.sh: 192.168.1.7
Подсессия или подпроцесс мало отличается от подоболочки, которую мы видели ранее. Любой код в круглых скобках
()
запускается во вспомогательной оболочке. Под-оболочкой также является отдельный процесс ( за исключением KSh ), запускаемый основным процессом оболочки, но в отличие от подсеанса, это идентичная копия основного процесса оболочки. В этой статье объясняются различия между суб-оболочкой и подпроцессом.
Мы также можем передать переменную окружения процессу непосредственно из команды, запустившей его, используя приведенный ниже синтаксис.Таким образом, наши переменные среды могут быть переносимы, и мы можем избежать написания ненужного шаблона.
# main.sh
MY_IP = '192.168.1.7' bash ./child.sh-------------------------- ----- ~ $ bash main.sh
⥤ MY_IP внутри child.sh: 192.168.1.7
Если вам нужно установить переменную среды для всего процесса, запущенного текущим сеансом терминала, пользователи могут напрямую выполнить команда экспорта
. Но как только вы откроете новый терминал, у него не будет этой переменной окружения.Чтобы сделать переменные среды доступными для всех сеансов терминала, экспортируйте их из .bash_profile
или любого другого сценария запуска.
💡 Рекомендуется записывать переменные среды во всех прописных, и переменных оболочки во всех строчных , но мой личный выбор - использовать все прописные буквы для обоих типов. Если вы хотите проверить, существует ли переменная среды в сеансе терминала, вы можете просто повторить ее с помощью команды
echo $ SOME_ENV_VAR
.
5. Блок кода (блок операторов)
Если нам нужно выполнить какой-то код как блок, мы можем поместить наш код в фигурные скобки {}
. В отличие от блока ()
, который выполняет код внутри него во вспомогательной оболочке, блок кода выполняет код в той же оболочке, следовательно, в том же процессе оболочки. Давайте посмотрим на быстрый пример.
MAIN_VAR = "main" {
спящий режим 1;
echo "code-block: $ MAIN_VAR"
} ⥤ code-block: main
Если мы хотим запустить какой-то код как блок в одной строке, нам нужно завершить операторы с помощью ;
символ ( в отличие от суб-оболочки ).
MAIN_VAR = "main" { sleep 1; echo "кодовый блок: $ MAIN_VAR"; }
( sleep 1; echo "sub-shell: $ MAIN_VAR") ⥤ code-block: main
⥤ sub-shell: main
В этом примере и кодовый блок, и sub-shell имеют доступ к MAIN_VAR
, потому что блок кода выполняется в той же среде, что и основная оболочка, в то время как вспомогательная оболочка может выполняться в другом процессе, но имеет идентичную копию основного процесса, который также содержит переменные из основного процесса.
Разница заключается в том, что мы пытаемся установить или обновить переменную в основном процессе из вспомогательной оболочки. Вот демонстрация этого.
VAR_CODE_BLOCK = "INIT"
VAR_SUB_SHELL = "INIT" {VAR_CODE_BLOCK = "MODIFIED"; echo "кодовый блок: $ VAR_CODE_BLOCK"; }
(VAR_SUB_SHELL = "MODIFIED"; echo "sub-shell: $ VAR_SUB_SHELL") echo "основной / кодовый блок: $ VAR_CODE_BLOCK"
echo "main / sub-shell_SHELL" код_SHELL_SUB: $ VAR_SUB -block: MODIFIED
⥤ sub-shell: MODIFIED
⥤ main / code-block: MODIFIED
⥤ main / sub-shell: INIT
Из приведенного выше примера мы можем интерпретировать это, когда мы пытаемся обновить или установить переменную в суб-оболочка, она установит новую переменную в своей собственной среде.
Хороший вариант использования блока кода - pipe (|)
или перенаправить (>)
вывод некоторых операторов в целом.
{ echo -n "Привет"; сон 1; echo «Мир!»; } > hello.txt ------------------------------- ~ $ bash main.sh && cat hello.txt
⥤ Привет, мир!
6. Специальные символы
Во многих примерах мы видели, что небезопасно передавать переменную , как , в команду или использовать ее внутри выражения, потому что Bash расширяет ее в серии аргументов ( или серии слов ).
Нет никакого вреда, если наша строка содержит простые слова. Проблема возникает, когда слово означает нечто иное, чем Bash, например, *
. Такие символы называются специальными символами, и они должны быть либо экранированы с помощью \
, например \ *
, либо заключены в кавычки, например "*"
.
https://gist.github.com/thatisuday/10b6c065fd9c98d7fff74127fb356364
💡 Здесь - это полный список специальных символов в Bash, на которые следует обратить внимание.
Как запустить сценарий оболочки файла .sh (bash / ksh) в Linux / UNIX
Я скачал программное обеспечение для своей Linux или Unix-подобной системы из Интернета. Есть файл install.sh. Как запустить файл .sh для установки программного обеспечения в macOS? Как вы запускаете файлы .sh из командной строки?
Вы можете открыть или запустить файл .sh в терминале Linux или Unix-подобной системы. Файл .sh - это не что иное, как сценарий оболочки для установки данного приложения или выполнения других задач в операционных системах Linux и UNIX.Самый простой способ запустить сценарий оболочки .sh в Linux или UNIX - это ввести следующие команды. Откройте терминал (приглашение вашей оболочки) и введите команды.
Подробности руководства | |
---|---|
Уровень сложности | Easy (rss) |
Права root | Нет |
Требования | Linux или Unix-подобные системы |
Приблиз. время чтения | 2м |
Как мне бежать.sh сценарий оболочки файла в Linux?
Процедура запуска сценария оболочки файла .sh в Linux выглядит следующим образом:
- Откройте приложение Терминал в Linux или Unix
- Создайте новый файл сценария с расширением .sh с помощью текстового редактора
- Запишите файл сценария, используя nano имя-сценария-here.sh
- Установите разрешение на выполнение вашего скрипта с помощью команды chmod:
chmod + x script-name-here.sh - Для запуска сценария:
./script-name-here.sh
Другой вариант выполнения сценария оболочки:
sh script-name-here.sh
OR bash script-name-here.sh
Давайте подробно рассмотрим примеры скриптов и их использование.
Синтаксис
Синтаксис:
sh file.sh
ИЛИ
bash file.sh
Как запустить файл .sh от имени пользователя root
Некоторое время вам понадобится root-доступ для установки приложения; без root у вас не будет необходимых разрешений для установки приложения или внесения изменений на системном уровне.Доступ с правами root по умолчанию отключен во многих Linux и UNIX подобных системах. Просто используйте команду sudo или su следующим образом:
sudo bash filename.sh
Введите свой пароль. Другой вариант - использовать команду su, чтобы стать суперпользователем:
su -
Введите пароль пользователя root и, наконец, запустите свой сценарий:
bash filename.sh
Как использовать команду chmod для запуска сценария оболочки .sh в Linux
Другой рекомендуемый вариант - установить разрешение для исполняемого файла с помощью команды chmod следующим образом:
chmod + x file.sh
Теперь вы можете запустить свой файл .sh следующим образом:
./file.sh
/path/to/file.sh
Как запустить файл .sh с именем install.sh?
Просто выполните две следующие команды:
chmod + x install.sh
./install.sh
Точка (.) Относится к текущему рабочему каталогу. Install.sh находится в текущем каталоге, поэтому вы запускаете его, как указано выше, или также следующим образом:
bash install.sh
ИЛИ
sh install.sh
GUI метод для запуска.sh файл
- Выберите файл с помощью мыши.
- Щелкните файл правой кнопкой мыши.
- Выбрать Свойства :
- Щелкните вкладку Разрешения .
- Выберите Разрешить выполнение файла как программы:
- Теперь щелкните имя файла, и вам будет предложено. Выберите «Выполнить в терминале», и он будет выполнен в терминале.