Bash в unix: Bash в примерах. Часть 1.

Содержание

23 продвинутые команды для глубокого изучения Linux

Знать всё: продвинутые команды Bash для глубокого погружения в терминал с разбором внутреннего устройства Linux.

Уже освоили команды Bash для новичков? Тогда двигаемся дальше, к продвинутому уровню.

Посмотрите на команду whoami, которая проверяет имя пользователя:

[email protected]:~$ whoami
geekpress

А вот как можно запустить команду bash от имени другого пользователя, с sudo -u username:

[email protected]:~$ sudo -u test touch def && ls -l
total 0
-rw-r--r-- 1 test test 0 Jan 11 20:05 def

Когда не указан флаг -u, команда выполняется от имени суперпользователя root без ограничений:

[email protected]:~$ sudo touch ghi && ls -l
total 662936
-rw-r--r-- 1 root      root              0 Feb 27 14:35 ghi
drwxr-xr-x 4 geekpress geekpress      4096 Feb  5 23:54 go

Хотите стать другим пользователем? С su это реально. Чтобы вернуться в свою учетную запись, используйте exit:

[email protected]:~$ su luser
Password: 
$ whoami
luser
$ exit

[email protected]:~$ whoami
geekpress

Суперпользователь – единственный пользователь, который может устанавливать программы, создавать новых юзеров и все в таком духе. Иногда можно забыть об этом и получить ошибку:

[email protected]:~$ apt install golang
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

Введите команду заново, используя sudo:

[email protected]:~$ sudo apt install golang
Reading package lists...

Или используйте !! для возврата к предыдущей команде:

[email protected]:~$ apt install golang
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

[email protected]:~$ sudo !!
sudo apt install golang
Reading package lists...

По умолчанию после использования sudo система не запрашивает пароль в течении 15 минут. А вот далее для sudo нужно заново вводить пароль суперпользователя.

Файлы доступны для чтения (r), записи (w) и исполнения (x) пользователям или группам. Просматривайте права доступа к файлам с помощью ls -l:

[email protected]:~$ ls -lh
total 648M
-rw-r--r-- 1 root      root         0 Feb 27 14:35 ghi
drwxr-xr-x 4 geekpress geekpress 4.0K Feb  5 23:54 go

Права представлены первыми десятью символами.

Первый символ представляет тип файла: d – директория, l – ссылка, - – файл. Дальше следуют три группы из трёх символов, которые отражают разрешения пользователя, владельца, группы и остальных пользователей.

r означает, что группа или пользователь имеют права на чтение файла. w – это права на изменение, а x – на выполнение. Пока что ничего сложного, правда?

Эти разрешения также представляются трехзначным числом, где x увеличивает значение на 1, w, если включен, – на 2 и r – на 4. Поэтому в бинарном представлении, директории выше имеют права доступа 644 и 755. Например r-x -> 101 -> 5.

Следующие строки – имя и группа владельца. За ними следуют размер, дата последнего изменения и название файла. Флаг -h означает «human-readable» и печатает 4.0K вместо 4096 байт.

chmod изменяет разрешения файла, устанавливая биты доступа:

[email protected]:~$ chmod 777 public && chmod 000 topsecret && ls -h
total 750M
-rwxrwxrwx 1 geekpress geekpress    0 Feb 27 16:14 public
---------- 1 geekpress geekpress    0 Feb 27 16:14 topsecret

Или добавлением и удалением разрешений флагами + и -:

[email protected]:~$ chmod +rwx topsecret && chmod -w public && ls -lh
chmod: public: new permissions are r-xrwxrwx, not r-xr-xr-x
total 750M
-r-xrwxrwx 1 geekpress geekpress    0 Feb 27 16:14 public
-rwxr-xr-x 1 geekpress geekpress    0 Feb 27 16:14 topsecret

chown изменяет владельца:

[email protected]:~$ sudo chown luser public

chgrp меняет группу владельцев:

[email protected]:~$ sudo chgrp luser 1 && ls -lh
total 750M
-rw-r--r-- 1 geekpress luser        0 Feb 27 16:48 1
-rw-r--r-- 1 geekpress geekpress    0 Feb 27 16:48 2
-rw-r--r-- 1 geekpress geekpress    0 Feb 27 16:48 3

Управляем пользователями и группами

Переходим к самому интересному списку команд bash, а именно к тем, которые затрагивают юзеров и группы.

users отображает авторизованных пользователей. Некоторые из них могут быть авторизованы несколько раз, например, при разных сессиях ssh.

[email protected]:~$ users
geekpress neo neo neo neo neo trinity trinity

Чтобы посмотреть всех пользователей (даже тех, кто не авторизован), проверьте /etc/passwd. Но не вносите изменения в файл! Вы можете повредить его и сделать невозможной авторизацию пользователей.

[email protected]:~$ alias au="cut -d: -f1 /etc/passwd \
> | sort | uniq" && au
 _apt
agentsmith
geekpress...

Добавляйте пользователей командой useradd:

[email protected]:~$ sudo useradd morpheus && au
_apt
agentsmith
morpheus...

Удаляйте их командой userdel:

[email protected]:~$ sudo userdel agentsmith && au
_apt
geekpress
morpheus...

groups показывает группы, в которых состоит текущий пользователь:

[email protected]:~$ groups
geekpress cdrom floppy sudo audio dip video plugdev netdev bluetooth

Нужно посмотреть все группы в системе? Для этого есть команда /etc/groups. Не модифицируйте файл, если не уверены в том, что делаете.

[email protected]:~$ alias ag=“cut -d: -f1 /etc/group \
> | sort” && ag
adm
avahi
daemon...

Добавляйте группы с помощью groupadd:

[email protected]:~$ sudo groupadd matrix && ag
adm
avahi
matrix...

А удаляйте посредством groupdel:

[email protected]:~$ sudo groupdel matrix && ag
adm
avahi
daemon...

Работаем с текстом

uniq печатает повторяющиеся строки:

[email protected]:~$ printf "hello\nBash" > a && printf "hello\nagain\nBash" > b
[email protected]:~$ uniq a
hello
Bash

sort сортирует строки по алфавиту или номеру:

[email protected]:~$ sort a
Bash
hello

diff покажет отличия между двумя файлами:

[email protected]:~$ diff a b
1a2
> again

cmp показывает отличия в байтах:

[email protected]:~$ cmp a b
a b differ: byte 7, line 2

cut используется для деления строки на разделы и подходит для обработки CSV. -d указывает символ деления, а -f – отрезок для печати:

[email protected]:~$ printf "192.168.1.1" > z

[email protected]:~$ cut -d'.' z -f2
168

sed меняет строки:

[email protected]:~$ echo "abc" | sed s/abc/xyz/
xyz

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

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

Хотите узнать больше о чудо-команде? Не вопрос. Полезные ссылки для изучения

sed:

Ищем и сопоставляем

grep ищет строки в файлах по заданному шаблону:

[email protected]:~$ grep -e ".*go.*" ./README.md 
Some of the tools, `godoc` and `vet` for example, are included in binary Go
`go get`.
The easiest way to install is to run `go get -u golang.org/x/tools/...`. You can
also manually git clone the repository to `$GOPATH/src/golang.org/x/tools`.
...

Или по заданному слову:

[email protected]:~$ grep "geekpress" /etc/passwd
geekpress:x:1000:1000:geekpress,,,:/home/geekpress:/bin/bash

Используйте расширенные регулярные выражения с помощью флага -E, сопоставляйте несколько строк одновременно (-F) и рекурсивно выполняйте поиск по файлам в каталоге (-r).

awk – это язык сопоставления шаблонов, построенный для чтения и манипулирования файлами данных, таких как

CSV.

Как правило, grep хорош для поиска строк и шаблонов, sed – для замены строк в файлах, а awk – для извлечения строк и шаблонов в целях анализа.

В качестве демонстрации способностей awk возьмем файл, содержащий два столбца данных:

[email protected]:~$ printf "A 10\nB 20\nC 60" > file

Зациклим строки, добавим число к сумме, увеличим счетчик, найдем среднее:

[email protected]:~$ awk 'BEGIN {sum=0; count=0; OFS=" "} {sum+=$2; count++} END {print "Average:", sum/count}' file
Average: 30

awk, как и sed, является полной по Тьюрингу. Обе команды чрезвычайно полезны в сопоставлении по шаблону и в обработке текста. Для их описания будет мало и книги, поэтому читайте о них больше в отдельных статьях!

Копируем файлы по SSH

ssh – это сетевой протокол взаимодействия машин под управлением Unix-подобных ОС:

[email protected]:~$ ssh –p <port> [email protected]
Last login: Thu Feb 28 13:33:30 2019 from 192.xxx.xxx.102

Заметьте, как поменялось приглашение после авторизации на другой машине:

[email protected] exit
logout
Connection to 192.xxx.xxx.100 closed.

Создадим новый файл на своей машине:

[email protected]:~$ echo "blabla" > blabla

Скопируем файл на удаленный компьютер с помощью scp:

[email protected]:~$ scp –P <port> blabla [email protected]:~
blabla                                         100%    0     0.0KB/s   00:00

Зайдем на удаленную машину:

[email protected]:~$ ssh –p <port> [email protected]
Last login: Thu Feb 28 13:45:30 2019 from 192.xxx.xxx.102

И увидим наш файл:

[email protected]:~$ ls
blabla  projects  pdfs

[email protected]:~$ cat blabla
blabla

А как насчет оптимизации процесса? Здесь пригодится rsync – инструмент копирования файлов, который минимизирует объем копируемых данных путем поиска различий между файлами.

Предположим, есть директории a и b, содержащие один и два файла соответственно:

[email protected]:~/a$ ls && ls ../b
file0
file0  file1

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

[email protected]:~/a$ rsync -av ../b/* .
sending incremental file list...

Теперь a и b содержат одинаковые файлы:

[email protected]:~/a$ ls
file0 file1

rsync работает по ssh:

[email protected]:~/dir0$ ls

[email protected]:~/dir0$ rsync -avz -e "ssh -p <port>" [email protected]:~/dir1/* .
receiving incremental file list
file 0
file 1

sent 44 bytes  received 99 bytes  128.88 bytes/sec
total size is 0  speedup is 0.00

[email protected]:~/dir0$ ls
file 0  file 1

Запускаем длительные процессы

Иногда соединение ssh может прерваться из-за неполадок с сетью или оборудованием. При этом процессы, запущенные отключившимся пользователем, прерываются. Команда nohup предотвращает прерывания процессов даже после отключения пользователя. Отличная страховка! Вот как ею пользоваться.

Запустим команду yes с nohup:

[email protected]:~$ nohup yes &
[1] 31232

ps покажет процессы, запущенные текущим пользователем:

[email protected]:~$ ps | sed -n '/yes/p'
31283 pts/0    00:00:07 yes

Теперь выйдем из сессии, зайдем снова и увидим, что процесс исчез:

[email protected]:~$ ps | sed -n '/yes/p'


Но постойте! Процесс виден в выводе команд top и htop:

[email protected]:~$ top -bn 1 | sed -n '/yes/p'
31578 anatoly   20   0    5840    760    688 D   0.0  0.0   0:00.69 yes

Завершим процесс командой kill -9 с указанием PID:

[email protected]:~$ kill -9 31578
[1]+  Killed                  nohup yes

Проверим видимость в top и увидим, что процесса нет, потому что он был завершен:

[email protected]:~$ top -bn 1 | sed -n '/yes/p'


cron предоставляет легкие автоматизацию и планирование.

Можно настроить задачи в текстовом редакторе командой crontab -e. Вставим следующую строку:

* * * * * date >> ~/datefile.txt

Теперь cron вызывает команду date каждую минуты и записывает вывод в текстовый файл оператором >>:

[email protected]:~$ head ~/datefile.txt
Thu Feb 28 17:06:01 GMT 2019
Thu Feb 28 17:07:01 GMT 2019
Thu Feb 28 17:08:01 GMT 2019

Удалите строку в crontab, чтобы остановить выполнение задачи. cron можно настроить на выполнение задач поминутно в течении каждого часа (0 — 59), ежечасно в течении дня (0-23), ежедневно в течении месяца (1-31), ежемесячно в течении года (1-12) или в указанные дни недели (0-6, Пн-Вс). Это отображается пятью звездочками в начале. Замените звезды нужным числом, чтобы настроить расписание.

Хотите больше команд Bash и информации о Linux? Вас заинтересуют:

Источник: 101 команда Bash для начинающих и экспертов

Bash | Русскоязычная документация по Ubuntu

Bash (от англ. Bourne again shell, каламбур «Born again» shell — «возрождённый» shell) — это усовершенствованный и модернизированный shell.
Bash — это командный интерпретатор, работающий, как правило, в интерактивном режиме в текстовом окне, он также может читать команды из текстового файла, который в свое время называется скриптом. Как и все Unix-оболочки, он поддерживает автодополнение имён файлов и директорий, подстановку вывода результата команд, переменные, контроль за порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh. Другие функции, например, история, были скопированы из csh и ksh. Bash в основном удовлетворяет стандарту POSIX, но с рядом расширений. Bash является является акронимом от Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.

Встроенные команды

Теперь я покажу несколько встроенных команд в bash.
Первая команда это echo она выводит содержимое переменной или выражение на консоль.
Синтаксис

echo "Хороший день."

Вторая команда это printf команда для форматированного вывода, расширенный вариант команды echo.
Синтаксис

printf "Хороший день"

Ну и третья команда это pwd она выводит название текущего рабочего каталога.
Синтаксис

pwd

Создание скрипта или первый hello world

Теперь давайте напишим что-то типо hello world и запустим его, как же это сделать, а вот так.
Первое создадим файл hello.sh, потом дадим ему права на исполнение командой,

sudo chmod +x hello.sh

теперь дайте откроем данный файл и запишем в него следующие строки,

#!/bin/bash 
echo "Hello, world"

я объясню, что значат эти строки, первая строка указывает путь к интерпретатору bash, эта строка должна стоять в начале любого bash скрипта, а вторая выводит на экран предложение hello, world, теперь сохнаним наш файл и запустим его командой,

./hello.sh

и увидим напечатанное предложение hello, world.
Вот скрин для наглядности,


Думаю пока на этом все, если чем помог то я очень рад.

Ссылки

Жесткие и символьные ссылки. Курс «Введение в Linux и Bash»

Индексный дескриптор

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

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

Именно номер индекса является истинным именем файла в системе. Мы можем их увидеть с помощью ключа -i команды ls.

Жесткие ссылки

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

Имя файла, ссылающееся на его индексный дескриптор, называется жесткой ссылкой. Механизм жестких ссылок – это основной способ обращаться к файлу в Unix-подобных операционных системах.

Поскольку файл в операционной системе однозначно определяет только номер его дескриптора, а имя файла является лишь указателем-ссылкой на него, то очевидно таких ссылок можно создать множество. Все они будут указывать на один объект. Результатом этого является то, что у файла в Linux может быть несколько имен.

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

Почему бывает недостаточно одного имени файла? Все дело в удобстве доступа из разных мест файловой структуры, а также в предоставлении доступа. Так одно имя файла может быть в одном каталоге, второе – в другом.

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

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

Символьные, или мягкие, ссылки

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

  • их можно создавать только на файлы, но не на каталоги;

  • жесткую ссылку нельзя создать на файл, находящийся на другом диске.

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

Поэтому в операционных системах GNU/Linux поддерживается также механизм мягких ссылок. Часто их называют символьными ссылками. Они представляют собой файлы, указывающие не на индексные дескрипторы, а на имена файлов, т. е. на жесткие ссылки. Мягкая ссылка в Linux аналог ярлыка в Windows.

Поскольку жесткая ссылка указывает непосредственно на индексный дескриптор, а мягкая – только на жесткую ссылку, то если удалить все жесткие ссылки файла, то символьная ссылка работать не будет. Она станет «битой».

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

При удалении жесткой ссылки, на имя которой ссылалась символьная, последняя не наследует связь с дескриптором и утрачивает свою работоспособность. Если в данном примере удалить жесткую ссылку с именем logotip, то файлы pic1 и tux станут бесполезны, так как открыть файл 555795 с их помощью уже будет нельзя.

Жесткая ссылка – не копия!

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

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

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

В случае мягких ссылок, хоть и создается новый файл (с собственным индексным дескриптором), но он не содержит данных файла-оригинала, а лишь содержит запись адреса другого файла. Символьная ссылка – особый тип файла Linux.

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Перенаправление «2>&1», «>/dev/null» или потоки вывода в Unix (bash/sh)

Потоки вывода

Сообщения скриптов выводятся во вполне определенные потоки — потоки вывода. Таким образом то, что мы выводим через

echo «Hello, world!»

не просто выводится на экран, а, с точки зрения системы, а конкретно — командных интерпретаторов sh и bash — выводится через определенный поток вывода. В случае echo — поток под номером 1 (stdout), с которым ассоциирован экран.

Некоторые программы и скрипты так-же используют другой поток вывода — под номером 2 (stderr). В него они выводят сообщения об ошибках. Благодаря этому можно раздельно выхватывать из потоков обычные информационные сообщения и сообщения об ошибках и направлять и обрабатывать их раздельно.

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

Что такое «>somefile»

Такой записью в Unix (в интерпретаторах bash и sh) указывается перенаправление потоков вывода.

В следующем примере мы перенаправим все информационные (обычные) сообщения команды ls в файл myfile.txt, получив таким образом в этом файле просто список ls:

$ ls > myfile.txt


При этом после нажатия на Enter Вы не увидите ничего на экране, зато в файле myfile.txt будет находится все то, что должно было отобразиться на экране.

Однако давайте сделаем заведомо ошибочную операцию:

$ ls /masdfasdf > myfile.txt


И что случится? Т.к. директории masdfasdf в корне файловой системы не существует (я так предполагаю — вдруг у Вас есть?), то команда ls сгенерирует ошибку. Однако вывалит эту ошибку она уже не через обычный поток stdout (1), а через поток ошибок stderr (2). А перенаправление задано лишь для stdout («> myfile.txt»).

Т.к. поток stderr (2) мы никуда не перенаправили — сообщение об ошибке появится на экране и НЕ появится в файле myfile.txt

А теперь давайте выполним команду ls так, чтобы информационные данные записались в файл myfile.txt, а сообщения об ошибках — в файл myfile.err, при этом на экране во время выполнения не появится ничего:

$ ls >myfile.txt 2>myfile.err


Здесь нам встречается впервые указание номера потока в качестве перенаправления. Запись «2>myfile.err» указывает, что поток с номером 2 (stderr) нужно перенаправить в файл myfile.err.

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

2>&1

Нередко в скриптах можно встретить такую запись. Она означает: «Поток с номером 2 перенаправить в поток с номером 1», или «Поток stderr — направить через поток stdout». Т.е. все сообщения об ошибках мы направляем через поток, через который обычно печатаются обычные, не ошибочные сообщения.

$ ls /asfasdf 2>&1


А вот еще пример, в котором все сообщения перенаправляются в файл myfile.txt:

$ ls /asfasdf >myfile.txt 2>&1


При этом все сообщения, как об ошибках, так и обычные, будут записаны в myfile.txt, т.к. поток stdout мы сначала перенаправлили в файл, а потом указали, что ошибки нужно вываливать в stdout — соответственно, в файл myfile.txt

/dev/null

Однако иногда нам нужно просто скрыть все сообщения — не сохраняя их. Т.е. просто блокировать вывод. Для этого служит виртуальное устройство /dev/null. В следующем примере весь вывод обычных сообщений команды ls мы направим в /dev/null:

$ ls > /dev/null


На экране не будет отображено ничего, кроме сообщений об ошибках. А в следующем примере — и сообщения об ошибках будут блокированы:

$ ls > /dev/null 2>&1


Причем эта запись эквивалентна записи вида:

$ ls >/dev/null 2>/dev/null


А в следующем примере мы заблокируем только сообщения об ошибках:

$ ls 2>/dev/null

Заметьте, что здесь уже нельзя указывать «2>&1», т.к. поток (1) не перенаправлен никуда и в таком случае сообщения об ошибках будут банально вывалены на экран.

Что первее — яйцо или курица?

Я приведу Вам здесь 2 примера.

Пример 1)

$ ls >/dev/null 2>&1


Пример 2)

$ ls 2>&1 >/dev/null


С виду — от перестановки мест слогаемых сумма не меняется. Но порядок указателей перенаправления играет роль!

Дело в том, что интерпретаторы читают и применяют перенаправления слева направо. И сейчас мы разберем оба примера.

Пример 1

1) «>/dev/null» — мы направляем поток 1 (stdout) в /dev/null. Все сообщения, попадающие в поток (1) — будут направлены в /dev/null.

2) «2>&1» — мы перенаправляем поток 2 (stderr) в поток 1 (stdout). Но, т.к. поток 1 уже ассоциирован с /dev/null — все сообщения все-равно попадут в /dev/null.

Результат: на экране — пусто.

Пример 2

1) «2>&1» — мы перенаправляем поток ошибок stderr (2) в поток stdout (1). При этом, т.к. поток 1 по-умолчанию ассоциирован с терминалом — сообщения об ошибках мы успешно увидим на экране.

2) «>/dev/null» — а уже здесь мы перенаправляем поток 1 в /dev/null. И обычные сообщения мы не увидим.

Результат: мы будем видеть сообщения об ошибках на экране, но не будет видеть обычные сообщения.

Вывод: сначала перенаправьте поток, а потом на него ссылайтесь.

Параллельное выполнение в bash — MNorin.com

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

Использование фонового режима

Для организации параллельной работы нескольких программ часто используется запуск в фоновом режиме при помощи знака амперсанда — &. Например:

command1 &

Команда будет работать в фоне, при этом из текущей оболочки можно выполнять команды. Таким образом уже можно распараллелить какие-то действия. Можно запустить сразу несколько команд таким образом и дождаться, пока они все отработают. Для ожидания запущенных дочерних процессов используется команда wait. Эта команда без параметров ожидает окончания работы всех дочерних процессов, соответственно, для ожидания окончания 5 процессов понадобится выполнить команду всего 1 раз. В принципе, это легко реализуется через цикл. Например, так:

for i in {1..5}
do
    # запуск одного фонового процесса
    sleep 10 && echo $i &
done
# ожидание окончания работы
wait
echo Finished

И результат работы этого скрипта:

$ ./wait5.sh
1
5
4
2
3
Finished

Как видите, с виду одинаковые команды завершились не в том порядке, в котором мы их запустили. Давайте посмотрим теперь общее время выполнения скрипта.

$ time ./wait5.sh 
4
5
2
3
1
Finished

real	0m10.029s
user	0m0.000s
sys	0m0.008s

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

Использование пайпа

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

program1 | program2 | program3

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

command1 --option > dev/null | command2 param1 param2 > /dev/null | command3

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

Параллельное выполнение и ограничение количества фоновых задач в скрипте

Давайте рассмотрим такую практическую задачу — запустить 100 процессов параллельно, но так, чтобы работало одновременно не более 10 процессов. В общем, достаточно простая задача. Предположим, что все процессы работают произвольное количество времени. Пусть запуск одной задачи будет выглядеть как запуск команды sleep со случайным параметром от 0 до 29. Тогда скрипт будет выглядеть следующим образом:

#!/bin/bash

RANDOM=10
JOBS_COUNTER=0
MAX_CHILDREN=10
MY_PID=$$

for i in {1..100}
do
    echo Cycle counter: $i
    JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
    while [ $JOBS_COUNTER -ge $MAX_CHILDREN ]
    do
        JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
        echo Jobs counter: $JOBS_COUNTER
        sleep 1
    done
    sleep $(($RANDOM % 30)) &
done
echo Finishing children ...
# wait for children here
while [ $JOBS_COUNTER -gt 1 ]
do
    JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
    echo Jobs counter: $JOBS_COUNTER
    sleep 1
done
echo Done

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

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

  • Нажмите здесь, чтобы поделиться контентом на Facebook. (Открывается в новом окне)
  • Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
  • Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
  • Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
  • Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
  • Нажмите, чтобы поделиться в Skype (Открывается в новом окне)

Читаем и задаем значение переменных среды Linux

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

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

Переменные среды и переменные оболочки

Обычно, переменные имеют такой формат:

KEY=value
KEY="Some other value"
KEY=value1:value2

Несколько основных правил для работы с переменными:

  • Имена переменных чувствительны к регистру. Все переменные среды должны называться С ЗАГЛАВНОЙ БУКВЫ.
  • Чтобы назначить несколько значений для одной переменной используйте знак «двоеточия» в качестве разделителя.
  • Символ «=» не должны окружать пробелы.

Переменные можно классифицировать на две основные категории: переменные среды и переменные оболочки:

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

Есть несколько доступных команд, которые позволяют вам устанавливать и просматривать переменные среды в Linux:

  • env — Эта команда позволяет запускать другую программу в пользовательской среде без изменения текущей. Если использовать её без дополнительных аргументов, она выведет список текущих переменных среды.
  • printenv — Команда выведет на экран все или часть переменных.
  • set — Команда устанавливает или отменяет переменные оболочки. Если её использовать без аргумента, тогда она выведет список всех переменных, включая переменные окружения и оболочки, а также некоторые функции оболочки.
  • unset — Удаляет переменные оболочки и среды.
  • export — Устанавливает переменные среды.

Список переменных среды

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

Например, чтобы отобразить значение переменной среды HOME, вы должны выполнить:

printenv HOME

Выходные данные выведут домашний путь текущего пользователя системы:

Вывод:
/home/abuzov

Вы также можете передавать команде printenv более одного аргумента:

printenv LANG PWD
Вывод:
ru_RU
/home/abuzov

Если вы запустите команду printenv или env без аргументов, тогда вы получите список всех переменных среды:

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35;...
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=en_US
S_COLORS=auto
XDG_SESSION_ID=5
USER=linuxize
PWD=/home/linuxize
HOME=/home/linuxize
SSH_CLIENT=192.168.121.1 34422 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/linuxize
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LANGUAGE=en_US:
LOGNAME=linuxize
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

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

  • USER — Текущий пользователь системы.
  • HOME — Домашняя директория пользователя.
  • EDITOR — Редактор по умолчанию. Это редактор, который будет использоваться при вводе edit в терминале.
  • SHELL — Путь к оболочке текущего пользователя, такой как bash или zsh.
  • LOGNAME — Имя текущего пользователя
  • PATH — Список каталогов, которые нужно обойти при выполнении команд. Когда вы запускаете команду, система будет искать в этих каталогах исполняемый файл и использовать первый найденный.
  • LANG — Настройки языка.
  • TERM — Текущий терминал.
  • MAIL — Местоположение, где хранится почта текущего пользователя.

Команды printenv и env выводят только переменные окружения. Если вы хотите получить список всех переменных, включая окружение, оболочку и переменные, а также функции оболочки, вы можете использовать команду set без аргументов:

set
Вывод:
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

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

set | less

Конечно, можно использовать echo для вывода переменной оболочки. Например, чтобы вывести значение переменной BASH_VERSION выполните:

echo $BASH_VERSION
Вывод:
4.4.19(1)-release

Установка переменных среды

Чтобы лучше показать разницу между переменными оболочки и среды, попробуем начать с установки переменных оболочки, а затем перейдем к переменным среды.

Создадим новую переменную оболочки с именем MY_VAR и значением Abuzov, для этого введём:

MY_VAR='Abuzov'

Вы можете проверить, что переменная установлена, используя echo $MY_VAR. Для фильтрации вывода команды set с помощью grep set | grep MY_VAR:

echo $MY_VAR

Используйте команду printenv, чтобы проверить, является ли эта переменная переменной среды:

printenv MY_VAR

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

bash -c 'echo $MY_VAR'

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

export MY_VAR

Теперь выполнение команды printenv MY_VAR выведет на экран значение Abuzov. Дополнительно, можно устанавливать переменные среды командой в одну строку:

export MY_NEW_VAR="My New Var"

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

Постоянные переменные среды

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

  • /etc/environment — Используйте этот файл для настройки общих системных переменных. Переменные в этом файле устанавливаются в следующем формате
    FOO=barVAR_TEST="Test Var"
  • /etc/profile — Переменные, заданные в этом файле, загружаются при каждом входе в оболочку bash. Чтобы объявить переменные окружения в этом файле вам нужно использовать команду экспорта:
    export JAVA_HOME="/path/to/java/home"
    export PATH=$PATH:$JAVA_HOME/bin
  • Конфигурационные файлы для отдельных пользовательских оболочек. Например, если вы используете Bash, вы можете объявить переменные в ~ / .bashrc:
    export PATH="$HOME/bin:$PATH"

Чтобы загрузить новые переменные среды в текущий сеанс оболочки, используйте команду source:

source ~/.bashrc

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

Справка по команде Linux bash и примеры

Обновлено: 06.03.2020, Computer Hope

Сокращенно от «Bourne-Again Shell», bash — это оболочка Unix. Первоначально выпущенный в 1989 году как бесплатная замена Bourne Shell, bash является частью проекта GNU.

Bash — это оболочка по умолчанию в macOS, подсистеме Windows для Linux и большинстве операционных систем Linux.

Описание

bash — это sh-совместимый интерпретатор командного языка, который выполняет команды, считанные из стандартного ввода или из файла. bash также включает в себя полезные функции оболочек Korn и C (ksh и csh).

bash предназначен для реализации части Shell и Utilities спецификации IEEE POSIX (стандарт IEEE 1003.1). bash может быть настроен как POSIX-совместимый по умолчанию.

Синтаксис

 bash [ параметры ] [ файл ] 

Опции

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

Также доступны следующие варианты:

-c строка

Если присутствует опция -c , то команды читаются из строки . Если после строки есть аргументы, они присваиваются позиционным параметрам, начиная с $ 0 .

-i

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

Заставить bash действовать так, как если бы он был вызван как оболочка входа в систему. См. Раздел «Вызов» ниже для более подробной информации.

-r

Если присутствует опция -r , оболочка становится ограниченной (дополнительные сведения см. В разделе «Оболочка с ограничениями» ниже.

Если присутствует опция -s , или если после обработки опции не осталось аргументов, то команды считываются из стандартного ввода. Эта опция позволяет устанавливать позиционные параметры при вызове интерактивной оболочки.

-D

Список всех строк в двойных кавычках, перед которыми стоит $ , выводится на стандартный вывод.Это строки, которые подлежат языковому переводу, если текущая локаль не C или POSIX. Это подразумевает опцию -n ; никакие команды выполняться не будут.

[ — + ] O [ shopt_option ]

shopt_option — одна из опций оболочки, поддерживаемых встроенной программой shopt (подробности см. В разделе «Встроенные команды оболочки»). Если присутствует shopt_option , -O устанавливает значение этой опции; + O снимает его.Если shopt_option не указан, имена и значения параметров оболочки, принятые shopt, выводятся на стандартный вывод. Если опция вызова — + O , вывод отображается в формате, который можно повторно использовать в качестве ввода.

A сигнализирует об окончании опций и отключает дальнейшую обработку опций. Любые аргументы после рассматриваются как имена файлов и аргументы.Аргумент эквивалентен .

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

—отладчик

Задает выполнение профиля отладчика перед запуском оболочки. Включает расширенный режим отладки (см. Описание опции extdebug для встроенной функции shopt ниже).

— дамп-строки

Эквивалент -D , но вывод находится в формате файла GNU gettext po (переносимый объект).

— дамп-строки

эквивалент -D .

— справка

Показать сообщение об использовании и выйти.

—initfile файл , —rcfile файл

Выполнять команды из файла вместо общесистемного файла инициализации / etc / bash.bashrc и стандартный персональный файл инициализации ~ / .bashrc , если оболочка интерактивна (подробности см. в разделе «Вызов» ниже).

— вход

Эквивалент -l

— редактирование

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

— ннопрофильный

Не читать ни общесистемный файл запуска / etc / profile , ни какие-либо личные файлы инициализации ~ /.bash_profile , ~ / .bash_login или ~ / .profile . По умолчанию bash читает эти файлы, когда он запускается как оболочка входа (подробности см. В разделе «Вызов» ниже).

—norc

Не читайте и не выполняйте общесистемный файл инициализации /etc/bash.bashrc и персональный файл инициализации ~ / .bashrc , если оболочка интерактивна. Этот параметр включен по умолчанию, если оболочка вызывается как sh .

—posix

Измените поведение bash , где операция по умолчанию отличается от стандарта POSIX, чтобы соответствовать стандарту.

— ограниченный

Оболочка становится ограниченной (подробности см. В разделе «Оболочка с ограничениями» ниже).

Создание сценариев оболочки Unix с помощью ksh / bash

Создание сценариев оболочки Unix с помощью ksh / bash

Раздаточный материал курса: (последнее обновление 22 марта 2012 г.)


Эти примечания можно найти по адресу http: // www.dartmouth.edu/~rc/classes/ksh. В онлайн-версии есть много ссылок на дополнительную информацию, и она может быть более актуальной, чем распечатанные заметки

Цели этого класса — дать вам возможность:

  • Узнайте, какие проблемы подходят для сценариев оболочки
  • Просмотрите наиболее часто используемые команды Unix, которые полезны в сценариях оболочки.
  • Напишите простые сценарии оболочки, используя оболочки Bourne, Korn или Bash
Эти записи предназначены для использования в классе из 2 частей общей продолжительностью 3 часа.

Допущения:
Предполагается, что вы уже знаете, как:

  • авторизуйтесь и получите окно командной строки (любая оболочка)
  • запускать основные команды, перемещаться по каталогам
  • использовать простое перенаправление ввода / вывода и каналы
  • использовать текстовый редактор (любой)
  • посмотрите подробности использования команд на страницах руководства
Примеры команд показаны как . Многие команды показаны со ссылками на их полные страницы руководства ( sh )
Вывод команд показан следующим образом; необязательные элементы: [в скобках] .

Некоторые описания в этих примечаниях доступны более подробно, и обозначаются так:

Более подробная информация об этом элементе появится здесь. Печатные заметки включить всю дополнительную информацию

Разрешается загружать и использовать эти заметки и примеры сценариев, пока все уведомления об авторских правах остаются без изменений. Некоторые примеры взяты из текстов или онлайн-ресурсы, которые предоставили разрешение на распространение.
Эти примечания время от времени обновляются.Развитие» набор заметок http://northstar-www.dartmouth.edu/~richard/classes/ksh (Только Дартмут)

Ричард Бриттен, Вычислительные службы Дартмутского колледжа.
© 2003,2004,2010 Дартмутский колледж.
Комментарии и вопросы, свяжитесь с Richard.Brittain @ dartmouth.edu


Содержание

(1)

  • Текстовый файл, содержащий команды, которые можно было ввести непосредственно в оболочку.
    Нет никакой разницы в синтаксисе между использованием интерактивной командной строки и размещением команд. в файле. Некоторые команды полезны только при интерактивном использовании (например, вызов истории из командной строки) а другие команды слишком сложны для интерактивного использования.
  • Сама оболочка имеет ограниченные возможности — сила исходит от ее использования в качестве «клея» язык для объединения стандартных утилит Unix и специального программного обеспечения для создания инструмента полезнее, чем отдельные компоненты.
  • Для написания сценария оболочки можно использовать любую оболочку. Для этого первая строка каждого скрипта это:
    #! / path / to / shell (например, #! / bin / ksh ).
    Номер #! символов говорят системе найти следующий путь, запустить его и передать ему остальную часть файла в качестве входных данных. Любая программа , которая может читать команды из файла, может быть запущена таким образом, если она распознает соглашение о комментариях # .Программа запускается, а затем файл сценария дается ему в качестве аргумента. По этой причине сценарий должен быть не только исполняемым, но и читаемым. Exa

Краткое руководство по написанию сценариев с использованием оболочки bash

Простой сценарий оболочки

Сценарий оболочки — это не что иное, как список команд, выполняемых последовательно. Обычно сценарий оболочки должен начинаться со строки следующего вида:
#! / Bin / bash
ЭТО означает, что сценарий должен запускаться в оболочке bash независимо от того, какую интерактивную оболочку выбрал пользователь.Это очень важно, поскольку синтаксис разных оболочек может сильно различаться.
Простой пример
Вот очень простой пример сценария оболочки. Он просто запускает несколько простых команд
#! / bin / bash
echo "привет, $ USER. Я хочу перечислить некоторые твои файлы"
echo "список файлов в текущем каталоге, $ PWD"
ls # список файлов
 

Во-первых, обратите внимание на комментарий в строке 4. В сценарии bash все, что следует за знак фунта # (помимо имени оболочки в первой строке) рассматривается как комментарий.т.е. оболочка игнорирует это. Это на благо людей читая сценарий.

$ USER и $ PWD — это переменных . Это стандартные переменные, определенные самой оболочкой bash, их не нужно определять в скрипте. Обратите внимание, что переменные расширены , когда имя переменной находится внутри двойные кавычки. Расширенный — очень подходящее слово: оболочка в основном видит строку $ USER и заменяет ее значением переменной, затем выполняет команда.

Мы продолжим обсуждение переменных ниже…

Переменные

Любому языку программирования нужны переменные. Вы определяете переменную следующим образом:
X = "привет"
и обратитесь к нему следующим образом:
$
В частности, $ X используется для обозначения значения переменной X. Некоторые моменты, которые следует учитывать в отношении семантики:
  • bash станет недовольным, если вы оставите пробел по обе стороны от знака =. За Например, следующее дает сообщение об ошибке:
    X = привет
  • , хотя в моем примере есть цитаты, они не всегда необходимы.где вам нужны кавычки, — это когда ваши имена переменных включают пробелы. Например,
    X = привет, мир # ошибка
    X = "привет, мир" # ОК
Это потому, что оболочка, по сути, видит командную строку как кучу команды и аргументы команд, разделенные пробелами. foo = bar is считается командой. Проблема с foo = bar — это оболочка видит слово foo , разделенное пробелами, и интерпретирует его как команда. Точно так же проблема с командой X = hello world что оболочка интерпретирует X = hello как команду, а слово «мир» не имеет смысла (поскольку команда присваивания не принимает аргументы).
Одинарные кавычки против двойных кавычек

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

Пример

#! / bin / bash
echo -n '$ USER =' # опция -n предотвращает разрыв строки эхом
эхо "$ USER"
echo "\ $ USER = $ USER" # делает то же самое, что и первые две строки
 
Результат выглядит так (при условии, что ваше имя пользователя — elflord)
$ USER = elflord 
$ USER = elflord
так что двойные кавычки все еще есть работа.Двойные кавычки более гибкие, но менее предсказуемо. Учитывая выбор между одинарными кавычками и двойными кавычки, используйте одинарные кавычки.
Использование кавычек для заключения переменных

Иногда рекомендуется заключать имена переменных в двойные кавычки. Обычно это наиболее важно, если ваши переменные имеют значение (a) содержит пробелы или (b) — пустая строка. Вот пример:

#! / bin / bash
X = ""
если [-n $ X]; затем # -n проверяет, не пуст ли аргумент
echo "переменная X не является пустой строкой"
фи

 
Этот сценарий выдаст следующий результат:
переменная X не является пустой строкой
Зачем ? потому что оболочка расширяет $ X до пустой строки.Выражение [-n] возвращает истину (так как не имеет аргумента). Лучшим сценарием было бы:
#! / bin / bash
X = ""
если [-n "$ X"]; затем # -n проверяет, не пуст ли аргумент
echo "переменная X не является пустой строкой"
фи

 
В этом примере выражение расширяется до [-n «»], которое возвращает false, поскольку строка, заключенная в кавычки, явно пуста.
Расширение переменной в действии
Просто чтобы убедить вас, что оболочка действительно «расширяет» переменные. в том смысле, который я упоминал ранее, вот пример:
#! / bin / bash
LS = "ls"
LS_FLAGS = "- al"

$ LS $ LS_FLAGS $ HOME

 
Это выглядит немного загадочно.Что происходит с последней строкой в том, что он фактически выполняет команду
ls -al / home / elflord
(при условии, что / home / elflord — ваш домашний каталог). То есть оболочка просто заменяет переменные их значениями, а затем выполняет команду.
Использование скобок для защиты переменных
ОК. Вот потенциальная проблемная ситуация. Предположим, вы хотите повторить значение переменной X, за которым сразу следует буквы «abc». Вопрос: как ты это делаешь? Давай попробуем:
#! / bin / bash
X = ABC
эхо "$ Xabc"
 
Это не дает никаких результатов.Что пошло не так ? Ответ заключается в том, что оболочка думала, что мы просили переменная Xabc, которая не инициализирована. Чтобы справиться с этим, нужно поставить скобки вокруг X, чтобы отделить его от другие персонажи. Следующее дает желаемый результат:
#! / bin / bash
X = ABC
эхо "$ {X} abc"
 

Условные выражения, if / then / elif

Иногда необходимо проверить наличие определенных условий. У строки 0 длины? существует ли файл «foo» и является ли он символическим ссылка, или реальный файл? Во-первых, мы используем команду if для запуска теста.Синтаксис следующий:
if  условие 
тогда
 выписка1 
 выписка2 
..........
фи
 
Иногда вы можете указать альтернативное действие, когда состояние не работает. Вот как это делается.
if  условие 
тогда
 выписка1 
 выписка2 
..........
еще
 выписка3 
фи
 
в качестве альтернативы можно проверить другое условие если первое «если» не сработает.Обратите внимание, что можно добавить любое количество elifs.
если  условие1 
тогда
 выписка1 
 выписка2 
..........
elif  condition2 
тогда
 выписка3 
 заявление4 
........
elif  condition3 
тогда
 заявление5 
 заявление6 
........


фи
 

Операторы внутри блока между if / elif и следующим elif или fi выполняются, если соответствующее условие правда.Фактически, любая команда может заменить условия, и блок будет выполнен тогда и только тогда, когда команда вернет статус выхода 0 (другими словами, если команда завершилась «успешно»). Однако в ходе работы над этим документом нас будут интересовать только используя «test» или «[]» для оценки условий.

Тестовая команда и операторы
Команда, используемая в условных выражениях почти все время, — это тестовая команда. Тест возвращает истину или ложь (точнее, выходит с 0 или ненулевым статусом) в зависимости от того, пройден тест или нет.Это работает так:
тест операнд1 оператор операнд2
для некоторых тестов нужен только один операнд (operand2) Команда test обычно сокращается в такой форме:
[ операнд1 оператор операнд2 ]
Чтобы вернуть это обсуждение на землю, мы приведем несколько примеров:
#! / bin / bash
Х = 3
Y = 4
empty_string = ""
if [$ X -lt $ Y] # $ X меньше $ Y?
тогда
echo "\ $ X = $ {X}, который меньше \ $ Y = $ {Y}"
фи

если [-n "$ empty_string"]; тогда
echo "пустая строка не_пуста"
фи

если [-e "$ {HOME} /.fvwmrc "]; затем # проверить, существует ли ~ / .fvwmrc
echo "у вас есть файл .fvwmrc"
если [-L "$ {HOME} /. fvwmrc"]; then # это символическая ссылка?
echo "это символическая ссылка
elif [-f "$ {HOME} /. fvwmrc"]; тогда # это обычный файл?
echo "это обычный файл"
фи
еще
echo "у вас нет файла .fvwmrc"
фи

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

Команда тестирования должна быть в форме «операнд1 <пробел> оператор <пробел> операнд2» или оператор <пробел> операнд2, другими словами вам действительно нужно эти пробелы, поскольку оболочка считает первый блок, не содержащий пробелов быть либо оператором (если он начинается с ‘-‘), либо операндом (если это не так).Так, например; этот

если [1 = 2]; тогда
эхо "привет"
фи
 
дает в точности «неправильный» вывод (т.е. повторяет «привет», так как видит операнд но нет оператора.)

Еще одна потенциальная ловушка связана с незащищением переменных в кавычках. Мы уже приводили пример того, почему вы должны обернуть все, что вы хотите использовать для теста -n с кавычками. Однако есть много веских причин для постоянного использования цитат, или почти всегда.Неспособность сделать это, когда у вас есть переменные, развернутые внутри тестов, может приводит к очень странным ошибкам. Вот пример: Например,

#! / bin / bash
X = "- n"
Y = ""
если [$ X = $ Y]; тогда
эхо "X = Y"
фи
 
Это даст вводящий в заблуждение результат, поскольку оболочка расширяет наше выражение к
[-n =]
а строка «=» имеет ненулевую длину.
Краткое описание операторов тестирования
Вот краткий список операторов тестирования. Это ни в коем случае не исчерпывающе, но это, вероятно, все, что вам нужно запомнить (если вам что-то еще нужно, вы всегда можете проверить справочную страницу bash…)
оператор возвращает истину, если … количество операндов
-n операнд ненулевой длины 1
-z операнд имеет нулевую длину 1
-d существует каталог с именем , операнд 1
-f существует файл с именем , операнд 1
-eq операнды являются целыми числами и равны 2
-neq противоположность -eq 2
= операнды равны (как строки) 2
! = напротив = 2
-lt операнд 1 строго меньше операнда 2 (оба операнда должны быть целыми числами) 2
-gt операнд1 строго больше, чем операнд2 (оба операнда должны быть целыми числами) 2
-ge операнд1 больше или равно операнд2 (оба операнда должны быть целыми числами) 2
-le операнд 1 меньше или равен операнд 2 (оба операнда должны быть целыми числами) 2

Петли

Циклы — это конструкции, которые позволяют повторять процедуру или выполните ту же процедуру с несколькими разными предметами.В bash доступны следующие виды циклов
Для петель
Синтаксис циклов for лучше всего продемонстрировать на примере.
#! / bin / bash
для X красный зеленый синий
делать
эхо $ X
сделанный
 
Цикл for выполняет итерацию по элементам, разделенным пространством. Обратите внимание: если в некоторых элементах есть встроенные пробелы, вам необходимо защитите их цитатами. Вот пример:
#! / bin / bash
colour1 = "красный"
colour2 = "голубой"
colour3 = "темно-зеленый"
для X в "$ colour1" $ colour2 "$ colour3"
делать
эхо $ X
сделанный
 
Можете ли вы угадать, что было бы, если бы мы не использовали кавычки в для заявления? Это означает, что имена переменных должны быть защищены кавычками, если вы не уверены, что они не содержать любые пробелы.
Врезание в петли

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

эхо *
перечисляет все файлы и каталоги в текущем каталоге.
echo * .jpg
перечисляет все файлы jpeg.
echo $ {HOME} / public_html / *. Jpg
перечисляет все файлы jpeg в вашем каталоге public_html.

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

#! / bin / bash
для X в * .html
делать
grep -L '
    ' "$ X" сделанный
Циклы пока

Циклы while повторяются «пока» выполняется заданное условие.Пример этого:

#! / bin / bash
Х = 0
а [$ X -le 20]
делать
эхо $ X
Х = $ ((Х + 1))
сделанный
 

Возникает естественный вопрос: почему bash не позволяет использовать C как для циклов

для (X = 1, X <10; X ++)
Как это часто бывает, это не рекомендуется по какой-то причине: bash — это интерпретируемый язык, и довольно медленный в этом отношении. По этой причине не рекомендуется тяжелая итерация.

Замена команды

Подстановка команд — очень удобная функция оболочки bash.Это позволяет вам взять вывод команды и обработать его как будто это было написано в командной строке. Например, если вы хотите установить переменную X для вывода команды, вы делаете это с помощью подстановки команд.

Есть два способа подстановки команд: расширение скобок и расширение обратной кавычки.

Расширительные скобки работают следующим образом: $ ( команд ) расширяется до вывода команд Это разрешает вложение, поэтому команды могут включать раскрытие фигурных скобок

Расширение обратного апострофа расширяет команды ` ` до вывода команд

Приведен пример ;:

#! / bin / bash
files = "$ (ls)"
web_files = `ls public_html`
echo "$ files" # нам нужны кавычки для сохранения встроенных символов новой строки в $ files
echo "$ web_files" # нам нужны кавычки для сохранения новой строки
X = ʻexpr 3 \ * 2 + 4` # expr вычисляет арифматические выражения.man expr для подробностей.
эхо "$ X"
 

Преимущество метода подстановки $ () почти само собой разумеющееся: гнездо очень легко. Поддерживается большинством варианты оболочки Bourne (оболочка POSIX или лучше). Однако подстановка обратных кавычек немного более читабельна, и поддерживается даже самыми простыми оболочками (любая версия #! / bin / sh просто отлично)

Обратите внимание: если строки не защищены кавычками в приведенном выше операторе echo, новый в выводе строки заменяются пробелами.

Индекс от A до Z командной строки Linux

Индекс от A до Z командной строки Linux — SS64.com
 & Запустить новый процесс в фоновом режиме
  псевдоним Создать псевдоним •
  apropos Справочные страницы поиска (man -k)
  apt-get Поиск и установка пакетов программного обеспечения (Debian / Ubuntu)
  aptitude Поиск и установка пакетов программного обеспечения (Debian / Ubuntu)
  проверка орфографии aspell
  awk Найти и заменить текст, сортировка / проверка / индекс базы данных
б
  basename Удалить каталог и суффикс из имен файлов
  base32 Base32 кодирует / декодирует данные и выводит на стандартный вывод
  base64 Base64 кодирует / декодирует данные и выводит на стандартный вывод
  bash GNU Bourne-Again SHell
  bc Язык калькулятора произвольной точности
  bg Отправить в фон
  bind Установить или отобразить привязки клавиш и функций к строке чтения •
  break Выход из цикла •
  встроенный Запуск встроенной оболочки
  bzip2 Сжать или распаковать именованный файл (ы)
c
  cal Показать календарь
  case Условно выполнить команду
  cat Объединить и распечатать (отобразить) содержимое файлов
  cd Изменить каталог
  cfdisk Манипулятор таблицы разделов для Linux
  chattr Изменение атрибутов файлов в файловой системе Linux
  chgrp Изменить владельца группы
  chmod Изменить права доступа
  chown Изменить владельца файла и группу
  chpasswd Обновить пароли в пакетном режиме
  chroot Запустить команду с другим корневым каталогом
  chkconfig Системные службы (уровень выполнения)
  cksum Печать контрольной суммы CRC и количества байтов
  очистить Очистить экран терминала
  cmp Сравнить два файла
  comm Построчно сравнить два отсортированных файла
  команда Выполнить команду - игнорирование функций оболочки •
  continue Возобновить следующую итерацию цикла •
  cp Скопируйте один или несколько файлов в другое место
  cpio Копировать файлы в и из архивов
  cron Daemon для выполнения запланированных команд
  crontab Запланировать выполнение команды на более позднее время
  csplit Разделить файл на определяемые контекстом части
  curl Передача данных с сервера или на сервер
  разрезать Разделить файл на несколько частей
d
  дата Отображение или изменение даты и времени
  настольный калькулятор постоянного тока
  dd Data Duplicator - конвертировать и копировать файл, записывать заголовки дисков, загрузочные записи
  ddrescue Инструмент для восстановления данных
  объявлять переменные Declare и присваивать им атрибуты •
  df Показать свободное место на диске
  diff Показать различия между двумя файлами
  diff3 Показать различия между тремя файлами
  копать поиск DNS
  dir Кратко перечислить содержимое каталога
  dircolors Настройка цвета для 'ls'
  dirname Преобразование полного пути в просто путь
  dirs Показать список запомненных каталогов
  dmesg Распечатать сообщения ядра и драйверов
  du Оценка использования файлового пространства
е
  эхо Отображение сообщения на экране •
  egrep Поиск в файле (файлах) строк, соответствующих расширенному выражению
  извлечь Извлечь съемный носитель
  enable Включить и отключить встроенные команды оболочки •
  env Переменные среды
  настройки карты Ethernet ethtool
  eval Оценить несколько команд / аргументов
  exec Выполнить команду
  выход Выйти из оболочки
  ожидать Автоматизировать произвольные приложения, доступ к которым осуществляется через терминал
  развернуть Преобразовать вкладки в пробелы
  экспорт Установить переменную среды
  expr Вычислить выражения
ж
  false Ничего не делать, безуспешно
  fdformat Низкоуровневое форматирование дискеты
  fdisk Манипулятор таблицы разделов для Linux
  fg Отправить задание на передний план
  fgrep Поиск в файле (файлах) строк, соответствующих фиксированной строке
  файл Определить тип файла
  найти Поиск файлов, соответствующих заданным критериям
  fmt Переформатировать текст абзаца
  свернуть Перенос текста по указанной ширине.для расширения  слов  и выполнения  команд 
  форматирование Форматирование дисков или лент
  бесплатно Использование памяти дисплея
  fsck Проверка и восстановление целостности файловой системы
  ftp протокол передачи файлов
  функция Определение макроса функции
  fuser Определяет / уничтожает процесс, обращающийся к файлу
грамм
  gawk Найти и заменить текст в файле (ах)
  getopts Анализировать позиционные параметры
  grep Поиск файлов для строк, соответствующих заданному шаблону
  groupadd Добавить группу безопасности пользователя
  groupdel Удалить группу
  groupmod Изменить группу
  группы Распечатать имена групп, в которых находится пользователь
  gzip Сжать или распаковать названный файл (ы)
час
  hash Запомните полный путь имени аргумента
  head Вывести первую часть файла (ов)
  help Отображение справки для встроенной команды •
  история Команда История
  hostname Распечатать или задать имя системы
  htop Интерактивный просмотрщик процессов
я
  iconv Преобразование набора символов файла
  id Распечатать идентификатор пользователя и группы
  если условно выполнить команду
  ifconfig Настроить сетевой интерфейс
  ifdown Остановить сетевой интерфейс
  ifup Запустить сетевой интерфейс
  импорт Захват экрана X-сервера и сохранение изображения в файл
  установить Копировать файлы и установить атрибуты
  iostat Отчет о статистике ЦП и ввода-вывода
  IP-маршрутизация, устройства и туннели
j
  вакансии Список активных вакансий •
  соединить линии соединения в общем поле
k
  kill Убить процесс, указав его PID
  killall Убивать процессы по имени
л
  меньше Дисплей выводит по одному экрану за раз
  let Выполнять арифметические действия с переменными оболочки •
  ссылка Создать ссылку на файл
  ln Создать символическую ссылку на файл
  local Создать функциональную переменную •
  найти Найти файлы
  logname Распечатать текущее логин
  logout Выход из оболочки входа •
  смотреть Показать строки, начинающиеся с заданной строки
  Программа управления принтером lpc Line
  lpr Offline print
  lprint Распечатать файл
  lprintd Удалить задание на печать
  lprintq Список очереди печати
  lprm Удаляет задания из очереди печати
  lsattr Список атрибутов файлов во второй расширенной файловой системе Linux
  lsblk Список блочных устройств
  ls Список информации о файле (ах)
  lsof Список открытых файлов
  lspci Список всех устройств PCI
м
  сделать Перекомпилировать группу программ
  man Справочное руководство
  mapfile Считывает строки из стандартного ввода в переменную индексированного массива
  mkdir Создать новую папку (и)
  mkfifo Создание FIFO (именованных каналов)
  mkfile Создать файл
  mkisofs Создать гибридную файловую систему ISO9660 / JOLIET / HFS
  mknod Создание специальных файлов для блоков или символов
  mktemp Создать временный файл
  больше Дисплей выводит по одному экрану за раз
  большинство Просмотр или перелистывание текстового файла
  монтировать Смонтировать файловую систему
  mtools Управление файлами MS-DOS
  mtr Диагностика сети (traceroute / ping)
  mv Перемещение или переименование файлов или каталогов
  mmv Массовое перемещение и переименование (файлы)
п
  nc Netcat, чтение и запись данных по сети
  netstat Сетевые подключения / статистика
  nft nftables для фильтрации и классификации пакетов
  nice Установить приоритет команды или задания
  nl Нумерация строк и запись файлов
  nohup Запустить команду, невосприимчивую к зависаниям
  notify-send Отправлять уведомления на рабочий стол
  nslookup Интерактивный запрос серверов имен в Интернете
о
  открыть Открыть файл в приложении по умолчанию
  op Доступ оператора
п
  passwd Изменить пароль пользователя
  вставить Строки слияния файлов
  pathchk Проверить переносимость имени файла
  Инструменты анализа производительности Perf для Linux
  ping Проверить сетевое соединение
  pgrep Список процессов по имени
  pkill Убивать процессы по имени
  popd Восстановить предыдущее значение текущего каталога
  pr Подготовить файлы к печати
  printcap База данных возможностей принтера
  printenv Печать переменных среды
  printf Форматирование и печать данных •
  ps Статус процесса
  pushd Сохранить, а затем изменить текущий каталог
  pv Наблюдать за прохождением данных по каналу
  pwd Рабочий каталог печати
q
  квота Отображение использования диска и ограничений
  quotacheck Сканирование файловой системы на предмет использования диска
р
  RAM RAM диск устройство
  rar Архивные файлы со сжатием
  rcp Копирование файлов между двумя машинами
  read Прочитать строку из стандартного ввода •
  readarray Читать из стандартного ввода в переменную массива •
  только для чтения Пометить переменные / функции как доступные только для чтения
  reboot Перезагрузить систему
  переименовать Переименовать файлы
  renice Изменить приоритет запущенных процессов
  remsync Синхронизация удаленных файлов по электронной почте
  return Выход из функции оболочки
  rev Обратные строки файла
  rm Удалить файлы
  rmdir Удалить папку (и)
  rsync Удаленное копирование файлов (синхронизация файловых деревьев)
s
  экран Multiplex terminal, запускать удаленные оболочки через ssh
  scp Secure copy (удаленное копирование файла)
  sdiff Интерактивное слияние двух файлов
  Редактор потока sed
  выберите Принять ввод с клавиатуры
  seq Печать числовых последовательностей
  установить переменные и функции оболочки Manipulate
  sftp Программа безопасной передачи файлов
  shift Shift позиционные параметры
  shopt Параметры оболочки
  shutdown Завершение работы или перезапуск Linux
  Задержка сна на указанное время
  slocate Найти файлы
  sort Сортировать текстовые файлы
  источник Запускать команды из файла '.'
  split Разделить файл на части фиксированного размера
  ss Socket Статистика
  клиент ssh Secure Shell (программа удаленного входа)
  stat Отображение состояния файла или файловой системы
  Системные вызовы и сигналы strace Trace
  su Заменить идентификатор пользователя
  sudo Выполнить команду от имени другого пользователя
  sum Вывести контрольную сумму для файла
  приостановить Приостановить выполнение этой оболочки •
  синхронизировать Синхронизировать данные на диске с памятью
т
  tail Вывод последней части файла
  tar Хранить, перечислять или извлекать файлы в архиве
  tee Перенаправить вывод на несколько файлов
  test Вычислить условное выражение
  время Измерение Время работы программы
  тайм-аут Выполнить команду с ограничением по времени
  раз Пользовательское и системное время
  нажмите Изменить отметки времени файла
  вверх Список процессов, запущенных в системе
  tput Установить возможности терминала, цвет, положение
  traceroute Трассировка маршрута до хоста
  trap Выполнять команду, когда оболочка получает сигнал •
  tr Перевод, сжатие и / или удаление символов
  true Ничего не делать, успешно
  tsort Топологическая сортировка
  tty Распечатать имя файла терминала на stdin
  type Опишите команду •
ты
  ulimit Ограничить ресурсы пользователя •
  umask Маска создания файла пользователей
  umount Размонтировать устройство
  unalias Удалить псевдоним •
  uname Распечатать системную информацию
  не раскрыть Преобразовать пробелы в табуляции
  uniq Uniquify файлы
  единицы Преобразование единиц из одной шкалы в другую
  unrar Извлечь файлы из архива rar
  unset Удалить имена переменных или функций
  unshar Распаковать архивные сценарии оболочки
  до выполнения команд (до ошибки)
  время работы Показать время работы
  useradd Создать новую учетную запись пользователя
  userdel Удалить учетную запись пользователя
  usermod Изменить учетную запись пользователя
  users Список пользователей, которые в данный момент вошли в систему
  uuencode Кодировать двоичный файл
  uudecode Расшифровать файл, созданный uuencode
v
  v Подробный список содержимого каталога ('ls -l -b')
  vdir Подробный список содержимого каталога ('ls -l -b')
  vi Текстовый редактор
  vmstat Отчет статистики виртуальной памяти
ш
  w Показать, кто вошел в систему и что они делают
  ждать Дождаться завершения процесса •
  смотреть Периодически запускать / отображать программу
  wc Печать количества байтов, слов и строк
  whereis Поиск по пути пользователя, страницам руководства и исходным файлам для программы
  который выполняет поиск файла программы в $ path пользователя
  в то время как выполнять команды
  who Распечатайте все имена пользователей, которые в данный момент вошли в систему
  whoami Распечатать текущий идентификатор и имя пользователя ('id -un')
  wget Получение веб-страниц или файлов через HTTP, HTTPS или FTP
  написать Отправить сообщение другому пользователю
Икс
  xargs Выполняет утилиту, передавая сконструированные списки аргументов
  xdg-open Открыть файл или URL-адрес в предпочитаемом пользователем приложении.xz Сжимать или распаковывать файлы .xz и .lzma
  да Печатать строку до прерывания
  zip Упаковывать и сжимать (архивировать) файлы.
  . Запустить командный сценарий в текущей оболочке
  !! Снова выполнить последнюю команду
  ### Комментарий / Замечание
 

Команды, отмеченные •, являются встроенными в bash
Многие команды, особенно Core Utils также доступны в альтернативных оболочках (оболочка C, оболочка Korn и т. д.).

Другие команды bash: Каталог команд Linux от O’Reilly, GNU CoreUtils.
Дискуссионный форум SS64 bash
Ссылки на другие сайты, книги и т. Д.


Авторские права © 1999-2020 SS64.com
Некоторые права защищены Справочное руководство по

Bash: Справочное руководство по

Bash:

Этот текст представляет собой краткое описание функций, присутствующих в оболочка Bash (версия 3.1-beta1, 5 сентября 2005 г.).

Это версия 3.1-beta1, последнее обновление — 5 сентября 2005 г. of Справочное руководство GNU Bash , для Bash , версия 3.1-бета1.

Bash содержит функции, которые появляются в других популярных оболочках, а некоторые функции, которые появляются только в Bash. Некоторые оболочки, которые есть в Bash заимствованы концепции из оболочки Bourne Shell (sh), оболочки Korn Shell (`ksh ‘) и C-shell (` csh’ и его преемник, tcsh). Следующее меню разбивает функции на категории, на основе которых одна из этих других оболочек вдохновила характерная черта.

Это руководство предназначено как краткое введение в функции, имеющиеся в Баш. Страницу руководства Bash следует использовать как окончательную ссылка на поведение оболочки.



1.1 Что такое Bash?

Bash — это оболочка или интерпретатор командного языка, для операционной системы GNU. Название является аббревиатурой от `Bourne-Again SHell ‘, каламбур Стивена Борна, автора прямого предка текущая оболочка Unix sh , который появился в седьмой редакции Bell Labs Research из Unix.

Bash в значительной степени совместим с sh и включает полезные функции оболочки Korn ksh и оболочки C csh .Он предназначен для реализации стандарта IEEE. Спецификация оболочки и инструментов POSIX (рабочая группа IEEE 1003.2). Он предлагает функциональные улучшения по сравнению с sh как для интерактивных, так и для использование программирования.

В то время как операционная система GNU предоставляет другие оболочки, включая версия csh , оболочка по умолчанию — Bash. Как и другие программы GNU, Bash довольно портативен. В настоящее время он работает почти во всех версиях Unix и некоторых других операционных системах — независимо поддерживаемые порты существуют для MS-DOS, OS / 2, и платформы Windows.


1.2 Что такое оболочка?

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

Оболочка Unix — это одновременно интерпретатор команд и средство программирования. язык. В качестве интерпретатора команд оболочка предоставляет пользователю интерфейс к богатому набору утилит GNU. Программирование языковые функции позволяют комбинировать эти утилиты.Файлы, содержащие команды, могут быть созданы и стать командует собой. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как `/ bin ‘, позволяющие пользователям или группы для создания пользовательских сред для автоматизации их общих задачи.

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

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

Оболочки также имеют небольшой набор встроенных команды ( встроенных ) реализация функциональности невозможна или неудобно получать через отдельные утилиты.Например, cd , break , continue и exec ) не может быть реализовано вне оболочки, потому что они напрямую манипулируют самой оболочкой. История , getopts , kill или pwd встроенные функции, среди прочего, могут быть реализованы в отдельных утилитах, но их удобнее использовать как встроенные команды. Все встроенные команды оболочки описаны в последующие разделы.

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

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

Bash Timestamp — получить временную метку Unix в bash

.

Метка времени Unix — это числовое представление (обычно очень большое число) определенной даты и времени.

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

Мы можем получить метку времени из нашей системы с помощью командной строки. Чтобы получить текущую временную метку Unix из терминала bash, мы можем выполнить следующую команду:

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

13021

Чтобы узнать, как именно рассчитывается эта метка времени и что именно означает это число, обратитесь к нашему руководству по форматированию даты.

Преобразование метки времени Bash в дату

Если бы у нас была отметка времени, и мы хотели бы преобразовать ее в дату, мы бы сделали это так:

 date -d @ 1353294612 "+% Y-% m-% d% T" 

Результат будет:

2012-11-18 22:10:12

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

Мы могли бы даже сделать что-нибудь вроде этого:

 date -d @ `date +% s`" +% T на% m /% d,% Y.«

А мы переформатируем и выведем текущее системное время:

09:47:57 01.12.2011.

Обратите внимание, что указанное выше время не меняется и было протестировано на момент написания этого руководства.

Преобразование даты в метку времени Bash

Если бы мы хотели сделать что-то наоборот, мы бы выполнили следующую команду оболочки:

 date -d "2011-12-25 05:10:43" "+% s" 

Результатом будет:

1324807843

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

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

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