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

Сегодня начнём разбирать возможности bash. Так как этот вопрос довольно объёмный, то его придётся разбить на несколько частей. Так что пойдём от простого к сложному. Кстати, есть очень большая вероятность, что информация, усвоенная при изучении bash, пригодится при работе с другими командными интерпретаторами.
Стандартный поток ввода и вывода.
Это довольно важные понятия означают всего навсего то, откуда по умолчанию читает программа данные (stdin) и куда выводит результаты своей работы (stdout). Также существует стандартный поток вывода ошибок (stderr). Обычно это экран (точнее, терминал пользователя) + клавиатура. Для чего это надо знать? А дело в том, что все эти потоки можно перенаправлять. Чаще всего для ввода/вывода используют файлы.
Например, так можно создать файл, содержащий список фалов в указанной директории.
$ ls -l > ~/file_with_files
Кстати, стоит помнить, что при следующем выполнении, файл будет полностью переписан, и всё, что было раньше потеряется. Если же нужно дописать в конец файла, то нужно использовать «>>» вместо «>»
$ ls -l >> ~/file_with_files
Также, при выполнении команды можно разделять потоки.
stdin имеет номер 0
stdout имеет номер 1
stderr имеет номер 2
То есть можно выводить ошибки в отдельный файл, причём обычные сообщения будут при этом отображаться как обычно. Для этого нужно перед «>» поставить число 2 (номер потока, аналогично для stdin, stdout). Например так
$ find / -name .bashrc 2> ~/finderrors.txt
Кроме того, существует такое устройство как /dev/null, на который можно также перенаправлять вывод. При этом ничего из направленного не будет нигде отображаться.
$ find / -name asdf 2 > /dev/null
Вывод можно направлять и в другую команду. Например, следующая команда выведет количество слов в файле
$ cat ~/finderrors.txt > wc -w
Если вам нужно написать скрипт, в котором какая-то программа требует ввода, то можно направить в неё содержимое файла
$ wc -w < ~/finderrors.txt
Примечание. «>» без указания номера потока трактуется как «1 >». То есть выводится будет только stdin.
Конвейеры.
Наверняка вы видели команды следующего вида:
$ cat /etc/bash.bashrc | more
В результате её работы будет приостановлен вывод при заполнении экрана. Так вот, «|» и есть этот самый конвейер. Говоря по-умному, это - канал, в который один процесс может только писать, а другой - только читать. Выборка и помещение в такой конвейер идёт по принципу FIFO (First In - First Out). Также этот принцип называется очередь, что очень просто и точно характеризует его работу. Конвейеры используются для того, чтобы скомбинировать работу нескольких маленьких программ.
Разберём работу следующей команды.
$ cat myfile | grep Linux | we -1
Сначала cat myfile выводит содержимое файла myfile, затем grep Linux считывает вывод и выделяет только строки содержащие слово Linux. Потом wc -l считает количество строк. В результате мы получим количество строк, содержащих слово Linux.
Очень удобно использовать утилиту xargs вместе с «|». xargs читает элементы вывода stdin, разделённые пробелами и выполняет программу, передав их ей один или несколько раз.
Например
$ find /tmp -name core -type f -print | xargs /bin/rm -f
Эта команда находит файлы с именем core в директории /tmp и удаляет их.
Специальные символы.
В отличие от ОС Windows, имена файлов в Linux могут содержать почти любые символы (например имя файла example*of:file вполне реально). Но некоторые знаки bash использует как служебные. И для корректной работы необходимо эти символы экранировать. Это можно делать несколькими способами.
Можно брать выражение в кавычки. Например
$ cp «example*of:file» ~
Также можно использовать одиночные кавычки
$ cp "example*of:file" ~
Отличие состоит в том, что в одиночных кавычек теряют своё значение все спецсимволы, в двойных - все, кроме $ и \
Но самым универсальным является С-подобный способ отмены специальных символов. Для этого достаточно перед символом поставить «\» (без кавычек). Например наша команда будет выглядеть следующим образом.
$ cp example\*of\:file ~
Выполнение команд.
Существует несколько символов для организации выполнения команд.
Если нужно последовательно выполнить несколько команд, то их следует разделить символом «;». Например, следующая последовательность скомпилирует файл (а компиляция - долгий процесс, можно в это время поспать!), затем выключит компьютер.
$ make ; sudo shutdown -h now
Если же нужно выполнить программу в фоновом режиме (то есть вернуть управление пользователю сразу после запуска, это бывает удобно при запуске графических приложений), то необходимо после команды поставить символ «&». Например
$ sudo synaptic &
В результате у нас запустится synaptic и можно будет не выходя из него, пользоваться текущим эмулятором терминала.
А что же делать, если нам нужно выполнить команду только в том случае, если операция успешно завершится. Например, есть следующая задача:
Нужно скомпилировать файл. Для этого нужно выполнить configure, make, sudo make install. Причём выполнять нужно только в том случае, если предыдущая команда закончилась успешно.
В таких случаях применяет последовательность «&&». Оператор, стоящий после «&&» выполняется только в том случае, если предыдущая завершилась успешно. То есть у нас это будет выглядеть так:
$ ./configure && make && sudo make install
Если же нужно выполнить только в том случае, если программа завершится с ошибкой, то нужно использовать «||». Например, усложним задачу. Нужно будет при ошибке записать её в файл, а затем, независимо от окончания, выключить компьютер.
$ ./configure && make && make install || echo fail > ~/errorfile ; sudo shutdown -h now
Шаблоны имён файлов
Проще всего их перечислить в табличке. Стоит помнить, что шаблоны можно комбинировать в одной команде.
Шаблон Значение
* Любая последовательность символов, в том числе и пустая
? Любой одиночный символ
{a,b,c,d} Любой из символов, перечисленных в скобках
Любой символ из указанных интервалов
[^0-6] Любой символ, не входящий в указанные интервалы
Проще всего их разбирать на примере.
Допустим, у нас есть папка, содержащая следующие файлы.
Glava01, Glava02, Glava03, Glava04, Glava05, Glava15, Glava17.
Применим шаблон Glava0* и получим список Glava01, Glava02, Glava03, Glava04, Glava05.
Применим шаблон Glava?5 и получим список Glava05, Glava15.
Применим шаблон Glava?{4,5} и получим список Glava04, Glava05, Glava15.
Применим шаблон Glava0 и получим список Glava01, Glava02, Glava03.
Выполнение арифметических выражений.
Да, bash и такое умеет. Для этого есть две формы
первая $[выражение]
вторая $((выражение))
Например
$ echo $
В результате выполнения выведется число 6. Если выражение некорректно, то bash выдаст сообщение об ошибке.
Подстановка команд.
Подстановка команд является очень мощным средством bash. Смысл в том, что записанная команда меняется на результат её выполнения. Существует две формы записи
$(команда) и `команда` (в этом случае используются не одиночные кавычки, а символы, получающиеся при комбинации SHIFT+~). Например, вот яркий пример, который используется в Debian при установке заголовочных пакетов текущего ядра.
# apt-get install linux-headers-`uname -r`
Команда uname -r при своём выполнении выдаёт версию используемого ядра. То есть при выполнении у меня она меняется на
# apt-get install linux-headers-2.6.25-2-686
Причём, у вас она может приобрести другой вид. Также можно поменять ядро, а пакеты устанавливать той же командой.
Фильтры
Это команды, которые могут преобразовать входной поток данных и вывести результат на стандартный поток вывода.
Команда Краткое описание
cat На стандартный вывод (то есть
на экран) выводится содержимое указанного файла (или нескольких фай-
лов, если их имена последовательно задать в качестве аргументов команды).
grep, fgrep, egrep Ищут во входном файле или данных со стандартного ввода строки, содержащие указанный шаблон, и выдают их на стандартный вывод
tr Заменяет во входном потоке все встречающиеся символы, перечисленные в заданном перечне, на соответствующие символы из второго заданного перечня
comm Сравнивает два файла по строкам и выдает на стандартный вывод 3 колонки: в первой - строки, которые встречаются только в 1-ом файле, во второй - строки, которые встречаются только во 2-ом файле, и в третьей - строки, имеющиеся в обоих файлах
pr Форматирует для печати текстовый файл или содержимое стандартного ввода
sed Строковый редактор, использующийся для выполнения некоторых преобразований над входным потоком данных (берется из файла или со стандартного ввода)
more и less Выводят содержимое файла на экран отдельными страницами размером как раз в целый экран.
wc Подсчитывает количество слов, строк или байт в потоке.
Например,
$ grep CONFIG_XEN . -Rl | xargs -i sed -i -e "s/CONFIG_XEN/CONFIG_LUPO/g" {}
Ищет файлы в текущей папке, содержащие строку «CONFIG_XEN» и меняет её на «CONFIG_LUPO» во всех найденных файлах.
Вот тут мы и сделаем перерыв для того, чтобы разобраться во всём объёме материала. Bash - очень мощный интерпретатор и для его освоения нужна практика. В следующей статье будет рассматриваться создание скриптов для него. Начнём программировать. До следующих встреч!
Метки: линух, статьи

Tags: Зачем нужен конвейер команд в bash

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

Команды /scoreboard teams add название /scoreboard teams list /scoreboard teams join название /scoreboard teams leave ...

google.com/bin/echo foo | grep bar" .... getpid() = 13726 <– PID ..... 1 · Почему в Ubuntu 16.04 медленный apt-get dist-upgrade? ... Спасибо, очень интересная статься… но как всегда нужна мера, чтобы не полочалось такого:

Feb 25, 2009 - do команды done. Рассмотрим небольшой пример: #!/bin/bash .... Конвеер - очень мощный инструмент для работы с консолью Bash. .... to do some stuff и пытаться понять почему каталог programs to do не найден… ... Может быть для этого нужны какие-то настройки, но у меня при этом...

Подскажите с решением нескольких заданий, пожалуйста. #!/bin/bash | Автор топика: Илья

30. Создайте конвейер для получения списка только имен и прав доступа к файлам, которые в данный момент находятся в Вашем рабочем каталоге. 31. Измените построенный конвейер так, чтобы список сохранялся в файле spisok Вашего HOME-каталога, а на экран выводилось только число файлов в списке. 32. Выведите на экран содержимое файла /etc/passwd, упорядоченное по полю с именем пользователя. 33. Создайте псевдоним loggedon, который будет выводить на экран упорядоченный в алфавитном порядке список имен работающих в системе пользователей. 34. Присвойте переменной IAM Ваше имя регистрации. Запустите еще один shell. Видите ли Вы эту переменную? Что нужно сделать, чтобы увидеть ее в порожденном shell? Измените значение переменной IAM в порожденном shell. Выйдите из порожденного shell. Посмотрите значение этой переменной в исходном shell. Объясните результат. 40. Напишите shell-программу hello, обеспечивающую следующую реакцию на аргументы командной строки: - аргумент “-d” - программа будет выполнять команду date; - аргумент “-l” - программа выведет содержимое текущего каталога; при отсутствии аргументов или неправильных аргументах в командной строке программа будет выводить справку о своих опциях. 41. Напишите программу words, которая будет выдавать пользователю приглашение на ввод по одному слову до тех пор, пока он не введет слово “end”. Запомните все введенные слова. После ввода слова “end” выведите на экран все введенные слова. Спасибо, если хотя бы одно из этого подскажете

Виталий  32. cat /etc/passwd | sort

Advanced Bash-Scripting Guide - Linux по-русски

Зачем необходимо знание языка Shell? 2. ..... Передача вывода от команды echo команде read, по конвейеру; 33-1. сценарий-обертка; 33-2. Более...

Перенаправление ввода/вывода - OpenNet

Advanced Bash-Scripting Guide: Искусство программирования на языке... Однострочные команды перенаправления # (затрагивают только ту строку, ... В конвейер передается только stderr. exec 3>&1 # Сохранить текущее...

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной. Синтаксис следующий:

for переменная in список_значений do команды done

Рассмотрим небольшой пример:

#!/bin/bash for i in 0 1 2 3 4 #переменной $i будем поочередно присваивать значения от 0 до 4 включительно do echo "Console number is $i " >> / dev/ pts/ $i #Пишем в файл /dev/pts/$i(файл виртуального терминала) строку "Console number is $i" done #цикл окончен exit 0

После выполнения примера в первых 5 виртуальных консолях (терминалах) появится строка с её номером. В переменную $i поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной.

Циклы. Цикл while

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно(код возврата = 0). Синтаксис оператора следующий:

while выражение или команда возвращающая код возврата do команды done

Пример работы цикла рассмотрим на следующем примере:

#!/bin/bash again =yes #присваиваем значение "yes" переменной again while [ "$again " = "yes" ] #Будем выполнять цикл, пока $again будет равно "yes" do echo "Please enter a name:" read name echo "The name you entered is $name " echo "Do you wish to continue?" read again done echo "Bye-Bye"

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

Ite@ite-desktop:~$ ./bash2_primer1.sh Please enter a name: ite The name you entered is ite Do you wish to continue? yes Please enter a name: mihail The name you entered is mihail Do you wish to continue? no Bye-Bye

Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.

Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор »[» аналог команды test, которая проверяет истинность условия, которое ей передали.

Рассмотрим еще один пример, я взял его из книги Advanced Bash scripting. Уж очень он мне понравился Улыбка, но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.

Вот пример:

#!/bin/bash echo "Введите числитель: " read dividend echo "Введите знаменатель: " read divisor dnd =$dividend #мы будем изменять переменные dividend и divisor, #сохраним их знания в других переменных, т.к. они нам #понадобятся dvs =$divisor remainder =1 until [ "$remainder " -eq 0 ] do let "remainder = dividend % divisor" dividend =$divisor divisor =$remainder done echo "НОД чисел $dnd и $dvs = $dividend "

Результат выполнения скрипта:

Ite@ite-desktop:~$ ./bash2_primer3.sh Введите числитель: 100 Введите знаменатель: 90 НОД чисел 100 и 90 = 10

Математические операции

Команда let.

Команда let производит арифметические операции над числами и переменными.

Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами:

#!/bin/bash echo "Введите a: " read a echo "Введите b: " read b let "c = a + b" #сложение echo "a+b= $c " let "c = a / b" #деление echo "a/b= $c " let "c <<= 2" #сдвигает c на 2 разряда влево echo "c после сдвига на 2 разряда: $c " let "c = a % b" # находит остаток от деления a на b echo "$a / $b . остаток: $c "

Результат выполнения:

Ite@ite-desktop:~$ ./bash2_primer2.sh Введите a: 123 Введите b: 12 a+b= 135 a/b= 10 c после сдвига на 2 разряда: 40 123 / 12. остаток: 3

Ну вот, как видите ничего сложного, список математических операций стандартный:

Сложение
- - вычитание
* - умножение
/ - деление
** - возведение в степень
% - модуль(деление по модулю), остаток от деления

let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных.

Например: a = a+b эквивалентно a +=b и т.д.

Работа с внешними программами при написании shell-скриптов

Для начала немного полезной теории.

Перенаправление потоков

В bash (как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr).

stdout - Стандартный вывод. Сюда попадает все что выводят программы
stdin - Стандартный ввод. Это все что набирает юзер в консоли
stderr - Стандартный вывод ошибок.

Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), < (перенаправление ввода). Оперировать ими не сложно. Например:

cat / dev/ random > / dev/ null

перенаправить вывод команды cat /dev/random в /dev/null (абсолютно бесполезная операция ) или

ls -la > listing

записать в файл listing содержание текущего каталога (уже полезней)

Если есть необходимость дописывать в файл (при использовании »>» он заменяется), необходимо вместо »>» использовать »>>»

sudo < my_password

после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.

Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:

./ program_with_error 2 > error_file

цифра 2 перед »>» означает что нужно перенаправлять все что попадет в дескриптор 2(stderr).

Если необходимо заставить stderr писать в stdout, то это можно можно след. образом:

./ program_with_error 2 >& 1

символ »&» означает указатель на дескриптор 1(stdout)

(По умолчанию stderr пишет на ту консоль, в которой работает пользователь (вернее пишет на дисплей)).

2. Конвейеры

Конвейер - очень мощный инструмент для работы с консолью Bash. Синтаксис простой:

команда1 | команда 2 - означает, что вывод команды 1 передастся на ввод команде 2

Конвейеры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:

ls -la | grep "hash" | sort > sortilg_list

вывод команды ls -la передается команде grep, которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке sort, которая пишет результат в файл sorting_list. Все довольно понятно и просто.

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постараюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную

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

A = ` echo "qwerty" ` echo $a

Результат работы: qwerty

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

LIST =` find / svn/ -type d 2>/ dev/ null| awk "{FS="/"} {print $4}" | sort | uniq | tr "\n" " " ` for ONE_OF_LIST in $LIST do svnadmin hotcopy / svn/ $ONE_OF_LIST / svn/ temp4backup/ $ONE_OF_LIST done

Здесь мы используем цикл for-do-done для архивирование всех директорий в папке /svn/ с помощью команды svnadmin hotcopy(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST=`find /svn/ -type d 2>/dev/null| awk "{FS=»/»} {print $4}"| sort|uniq | tr "\n" " "` В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.

Как видно, все не сложно, достаточно понять принцип и написать пару своих скриптов. В заключении статьи хочу пожелать удачи в изучении BASH и Linux в целом. Критика, как водится приветствуется. Следующая статья возможно будет посвящена использованию таких программ как sed, awk.

Что требуется?

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

Данный документ может быть необходим в следующих ситуациях:

У Вас имеются идеи, связанные с программированием, и существует необходимость в выполнении процесса кодирования каких-нибудь shell-скриптов.

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

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

Вы мигрируете из DOS/Windows (или уже выполнили это) и хотите создавать файлы пакетной обработки ("batch").

Вы - полный нерд и читаете любой попавший под руку how-to.

Простейшие скрипты

В данном HOW-TO осуществляется попытка предоставить Вам некоторые рекомендации по shell-программированию, основанные только на примерах.

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

Традиционный скрипт "hello world"

#!/bin/bash echo Hello World!

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

Вторая строка - это единственное действие, выполняемое данным скриптом, печатающее "Hello world" на терминале.

Если Вы получите что-то типа./hello.sh: Command not found. , то, возможно, первая строка "#!/bin/bash" неправильная; запустите whereis bash или посмотрите finding bash, чтобы выяснить, какой должна быть эта строка.

Простой скрипт резервного копирования

#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

В данном скрипте вместо печати сообщения на терминале мы создаём tar-архив пользовательского домашнего каталога. Скрипт НЕ предназначен для практического применения. Далее в данном документе будет представлен более эффективный скрипт резервного копирования.

Всё о перенаправлении Теория и быстрый просмотр

Существуют 3 файловых дескриптора: stdin - cтандартный ввод, stdout - стандартный вывод и stderr - стандартный поток ошибок.

Ваши основные возможности:
перенаправлять stdout в файл
перенаправлять stderr в файл
перенаправлять stdout в stderr
перенаправлять stderr в stdout
перенаправлять stderr и stdout в файл
перенаправлять stderr и stdout в stdout
перенаправлять stderr и stdout в stderr

1 означает stdout, а 2 - stderr. Небольшое примечание для более глубокого понимания: с помощью команды less Вы можете просмотреть как stdout, который остаётся в буфере, так и stderr, который печатается на экране. Однако он стирается, когда Вы предпринимаете попытки "просмотреть" буфер.

Пример: stdout в файл

Это действие записывает стандартный вывод программы в файл.

ls -l > ls-l.txt

Здесь создаётся файл с именем "ls-l.txt". В нём будет содержаться всё то, что Вы бы увидели, если бы просто выполнили команду "ls -l". 3.3 Пример: stderr в файл
Это действие записывает стандартный поток ошибок программы в файл.
grep da * 2> grep-errors.txt

Здесь создаётся файл, названный "grep-errors.txt". В нём будет содержаться часть вывода команды "grep;da;*", относящаяся к стандартному потоку ошибок. 3.4 Пример: stdout в stderr

Это действие записывает стандартный вывод программы в тот же файл, что и стандартный поток ошибок.
grep da * 1>&2

Здесь стандартный вывод команды отправляется в стандартный поток ошибок. Вы можете увидеть это разными способами. 3.5 Sample: stderr 2 stdout

Это действие записывает стандартный поток ошибок программы туда же, куда и стандартный вывод.
grep * 2>&1
Здесь стандартный поток ошибок команды отправляется на стандартный вывод; если Вы перешлёте результат через конвейер (|) в less, то увидите, что строки, которые обычно пропадают (как записанные в стандартный поток ошибок), в этом случае сохраняются (так как они находятся на стандартном выводе). 3.6 Пример: stderr и stdout в файл

Это действие помещает весь вывод программы в файл. Это является подходящим вариантом для заданий cron: если Вы хотите, чтобы команда выполнялась абсолютно незаметно.
rm -f $(find / -name core) &> /dev/null

Это (предположим, для cron) удаляет любой файл с названием "core" в любом каталоге. Помните, что Вам следует полностью быть уверенным в том, что выполняет команда, если возникает желание затереть её вывод. 4. Конвейеры

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

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

Пример: простой конвейер с sed

Это очень простой способ использования конвейеров.

ls -l | sed -e "s//u/g"

Здесь происходит следующее: первоначально выполняется команда ls;-l, и её вывод, вместо отображения на экране, отправляется в программу sed, которая, в свою очередь, выводит на экран то, что должна. 4.3 Пример: альтернатива для ls;-l;*.txt

Возможно, это значительно более сложный способ, чем ls;-l;*.txt, но он приводится здесь только для того, чтобы проиллюстрировать работу с конвейерами, а не для решения вопроса выбора из этих двух способов листинга.

ls -l | grep "\.txt$"

Здесь вывод программы ls -l отправляется в программу grep, которая, в свою очередь, выводит на экран строки, соответствующие регулярному выражению "\.txt$". 5. Переменные

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

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

Пример: "Hello World!", использующий переменные

#!/bin/bash
STR="Hello World!"
echo $STR

Вторая строка создаёт переменную, которая называется STR, и присваивает ей строчное значение "Hello World!". Затем ЗНАЧЕНИЕ этой переменной извлекается добавлением в начале знака "$". Пожалуйста, запомните (постарайтесь), что если Вы не используете знак "$", вывод программы может быть другим. Вероятно, не таким, который Вам требуется.
Пример: очень простой скрипт резервного копирования (более эффективный)
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz #OF - Output File - выходной файл
tar -cZf $OF /home/me/

Данный скрипт вводит ещё одно понятие. Прежде всего, Вам следует разобраться со второй строкой. Обратите внимание на выражение "$(date +%Y%m%d)". Если Вы запустите этот скрипт, то заметите, что он выполняет команду внутри скобок, перехватывая её вывод.

Обратите внимание, что в этом скрипте имя выходного файла будет ежедневно изменяться, исходя из формата ключа к команде date;(+%Y%m%d). Вы можете поменять это заданием другого формата.
Другие примеры:
echo ls
echo $(ls)

Локальные переменные

Локальные переменные могут быть созданы при использовании ключевого слова local.
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
Данного примера должно быть достаточно для отображения способов использования локальных переменных.

Условные операторы

Условные операторы предоставляют Вам возможность решить, выполнять действие или нет; решение принимается при вычислении значения выражения.

Просто теория

Существует большое количество форм условных операторов. Элементарная форма - это if выражение then оператор, где "оператор" выполняется только в том случае, если "выражение" имеет значение "истина". "2<1" - это выражение, имеющее значение "ложь", в то время как "2>1" - "истина".

Существуют другие формы условных операторов, такие как: if выражение then оператор1 else оператор2. Здесь "оператор1" выполняется, если "выражение"- истина; в противном случае, выполняется "оператор2".

Ещё одной формой условных операторов является: if выражение1 then оператор1 else if выражение2 then оператор2 else оператор3. В данной форме добавляется только последовательность "ELSE IF "выражение2" THEN "оператор2"", заставляющая "оператор2" выполняться, если "выражение2" имеет значение "истина". Всё остальное соответствует Вашему представлению об этом (см. предыдущие формы).

Несколько слов о синтаксисе:
Элементарная конструкция оператора "if" в bash выглядит следующим образом:
if [выражение];
then
code if "выражение" is true.
fi

Пример: элементарный образец условного оператора if;..;then
#!/bin/bash
if [ "foo" = "foo" ]; then

fi

Если выражением внутри квадратных скобок является истина, то выполняемый код находится после слова "then" и перед словом "fi", которое обозначает конец исполняемого при выполнении условия кода.
Пример: элементарный пример условного оператора if;..;then;...;else
#!/bin/bash
if [ "foo" = "foo" ]; then
echo-выражение вычислилось как истина
else

fi

Пример: условные операторы с переменными
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo-выражение вычислилось как истина
else
echo-выражение вычислилось как ложь
fi
Циклы for, while и until
В этом разделе Вы познакомитесь с циклами for, while и until.
Цикл for немного отличается от аналогов в других языках программирования. Прежде всего, он предоставляет Вам возможность выполнять последовательные действия над "словами" в строке.
Цикл while выполняет кусок кода, если тестируемым выражением является истина; и останавливается при условии, если им является ложь (или внутри исполняемого кода встречается явно заданное прерывание цикла).
Цикл until практически идентичен циклу while. Отличие заключается только в том, что код выполняется при условии, если проверяемым выражением является ложь.
Если Вы предполагаете, что while и until очень похожи, Вы правы.

Пример цикла for

#!/bin/bash
for i in $(ls); do
echo item: $i
done

Во второй строке мы представляем i в качестве переменной, которая получает различные значения, содержащиеся в $(;ls;).

При необходимости третья строка могла бы быть длиннее; или там могло бы находиться несколько строк перед done (4-я строка).

"done" (4-я строка) показывает, что код, в котором используется значение $i, заканчивается и $i получает новое значение.

Данный скрипт не предполагает большой важности. Более полезным применением цикла for было бы использование его для отбора только каких-то определённых файлов в предыдущем примере.
C-подобный for

fiesh предложил добавить эту форму цикла. Это цикл for, наиболее похожий на for в языках C, Perl и;т.п.

#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
Пример цикла while:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done

Данный скрипт "эмулирует" широко известную (в языках C, Pascal, perl и;т.д.) структуру "for".

Пример цикла until:

#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done

Функции

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

Объявление функции - это только лишь запись function my_func { my_code }.

Вызов функции осуществляется аналогичным образом, что и вызов других программ. Вы просто пишете её имя.

Пример функций
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo
В строках 2-4 содержится функция "quit". В строках 5-7 - функция "hello". Если Вам недостаточно понятен процесс, выполняемый данным скриптом, испытайте его!

Следует заметить, что совсем необязательно объявлять функции в каком-то определённом порядке.

Если Вы запустите скрипт, обратите внимание, что сначала вызывается функция "hello", а затем функция "quit". Что касается программы, она никогда не достигает 10-й строки.

Пример функций с параметрами
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo
Данный скрипт практически идентичен предыдущему. Главное отличие - это функция "e". Она выводит самый первый получаемый аргумент. Аргументы в функциях обрабатываются таким же образом, что и аргументы, переданные скрипту.

Интерфейсы пользователя

Использование select для создания простых меню
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
Если Вы запустите этот скрипт, то увидите, что он является мечтой программиста о меню на текстовой основе. Вероятно, Вы заметите, что это очень похоже на конструкцию "for", только вместо циклической обработки каждого "слова" в $OPTIONS программа опрашивает пользователя.
Использование командной строки
#!/bin/bash
if [ -z "$1" ]; then
echo используйте: $0 каталог
exit
fi
SRCD=$1 #SRCD - SouRCe Directory - исходный каталог

tar -cZf $TGTD$OF $SRCD
Вам должно быть понятно, что выполняет этот скрипт. Выражение в первом условном операторе проверяет, получила ли программа аргумент ($1). Если - нет, оно завершает работу программы, предоставляя пользователю небольшое сообщение об ошибке. Оставшаяся на данный момент часть скрипта, очевидно, является понятной.

Разное

Чтение пользовательского ввода с помощью read

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

#!/bin/bash
echo Введите, пожалуйста, Ваше имя
read NAME
echo "Привет, $NAME!"

В качестве варианта Вы можете получать сразу несколько значений с помощью read. Следующий пример поясняет это:
#!/bin/bash
echo "Введите, пожалуйста, Ваше имя и фамилию"
read FN LN #FN - First Name - имя; LN - Last Name - фамилия
echo "Hi! $LN, $FN !"

Арифметические вычисления

В командной строке (или оболочке) попробуйте ввести следующее:
echo;1;+;1
Если Вы рассчитываете увидеть "2", то будете разочарованы. Что следует выполнить, если возникает необходимость, чтобы BASH произвёл вычисления над Вашими числами? Решение заключается в следующем:
echo;$((1+1))
В результате этого вывод будет более "логичным". Такая запись используется для вычисления арифметических выражений. Вы также можете выполнить это следующим образом:
echo;$
Если Вам необходимо использовать дроби или более сложную математику, то можно использовать bc для вычисления арифметических выражений.
Когда автор запустил "echo;$" в командной оболочке, она вернула значение 0. Это связано с тем, что если bash отвечает, он использует только целые значения. Если Вы запустите "echo;3/4|bc;-l", оболочка вернёт правильное значение 0.75.

Поиск bash

Из сообщения от mike (смотрите раздел "Благодарность"):

Вы всегда используете #!/bin/bash .. Вы могли бы привести пример, каким образом можно обнаружить, где расположен bash.
Предпочтительнее использовать "locate bash", но locate имеется не на всех машинах.
"find ./ -name bash" из корневого каталога обычно срабатывает.
Можно проверить следующие расположения:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(автор не способен сразу придумать какой-либо другой каталог... Он находил bash в большинстве этих мест на различных системах).

Вы также можете попробовать "which bash".

Получение возвратного значения программы

В bash возвратное значение программы сохраняется в специальной переменной $?.

Данный пример иллюстрирует, как перехватить возвратное значение программы; автор предположил, что каталог dada не существует (это также предложил mike).
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?


Перехват вывода команды

Этот небольшой скрипт представляет все таблицы из всех баз данных (предполагается, что у Вас установлен MySQL). Кроме того, следует подумать о способах преобразования команды "mysql" для использования подходящего имени пользователя и пароля.
#!/bin/bash
DBS=`mysql -uroot -e"show databases"`
for b in $DBS ;
do
mysql -uroot -e"show tables from $b"
done

Несколько исходных файлов

Вы можете запускать несколько файлов с помощью команды source.

TO-DO__
11. Таблицы
11.1 Операторы сравнения строк
(1) s1 = s2
(2) s1 != s2
(3) s1 < s2
(4) s1 > s2
(5) -n s1
(6) -z s1
(1) s1 совпадает с s2
(2) s1 не совпадает с s2
(3) s1 в алфавитном порядке предшествует s2 (в соответствии с текущей локалью)
(4) s1 в алфавитном порядке следует после s2 (в соответствии с текущей локалью)
(5) s1 имеет ненулевое значение (содержит один символ или более)
(6) s1 имеет нулевое значение
11.2 Примеры сравнения строк

Сравнение двух строк.
#!/bin/bash
S1="string"
S2="String"
if [ $S1=$S2 ];
then
echo "S1("$S1") не равна to S2("$S2")"
fi
if [ $S1=$S1 ];
then
echo "S1("$S1") равна to S1("$S1")"
fi
На данный момент, автор считает необходимым процитировать замечание из письма, полученного от Андреаса Бека, которое связано с использованием if [ $1 = $2 ].
Это не является хорошей идеей, так как если либо $S1, либо $S2 - пустая строка, Вы получите синтаксическую ошибку. Более приемлимым будет использование x$1;=;x$2 или "$1";=;"$2" .
11.3 Arithmetic operators
+
-
*
% (remainder)
11.4 Арифметические операторы сравнения
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)
Программистам на C необходимо просто выбрать оператор, соответствующий выбранному оператору в скобках.

Полезные команды

Этот раздел переписал Kees (смотрите раздел "Благодарность").

Некоторые из этих команд практически содержат полноценные командные языки. Здесь объясняются только основы таких команд. Для более подробной информации внимательно просмотрите man-страницы каждой команды.
sed (потоковый редактор)
Sed - это неинтерактивный редактор. Вместо того, чтобы изменять файл движением курсора на экране, следует использовать сценарий инструкций по редактированию для sed, а также имя редактируемого файла. Вы также можете рассматривать sed в качестве фильтра. Посмотрите на некоторые примеры:
$sed "s/to_be_replaced/replaced/g" /tmp/dummy
Sed заменяет строку "to_be_replaced" строкой "replaced", читая файл /tmp/dummy . Результат отправляется на стандартный вывод (обычно, на консоль), но Вы также можете добавить ">;capture" в вышеуказанную строку, чтобы sed отправлял вывод в файл "capture".
$sed 12, 18d /tmp/dummy
Sed отображает все строки, за исключением строк с 12 по 18. Исходный файл этой командой не изменяется.
awk (манипулирование файлами данных, выборка и обработка текста)
Существует большое количество реализаций языка программирования AWK (наиболее распространенными интерпретаторами являются gawk из проекта GNU и "новый awk" mawk.) Принцип достаточно прост: AWK находится в поиске шаблона; для каждого подходящего шаблона выполняется какое-нибудь действие.
Автор повторно создал файл dummy, содержащий следующие строки:
"test123
test
tteesstt"

$awk "/test/ {print}" /tmp/dummy
test123
test
Шаблон, искомый AWK, это "test", а действие, выполняемое AWK при обнаружении строки в /tmp/dummy с подстрокой "test", это "print".
$awk "/test/ {i=i+1} END {print i}" /tmp/dummy
Если Вы находитесь в поиске нескольких шаблонов, замените текст между кавычками на "-f;file.awk". В этом случае, Вы можете записать все шаблоны и действия в файле "file.awk".
grep (выводит строки, соответствующие искомому шаблону)
Мы рассматривали несколько команд grep в предыдущих главах, которые отображали строки, соответствующие шаблону. Однако grep способен выполнять значительно большее.
$grep "look for this" /var/log/messages -c
Строка "look for this" была обнаружена 12 раз в файле /var/log/messages.
wc (считает строки, слова и байты)
В следующем примере можно заметить, что выводится не то, что мы ожидаем. В этом случае, файл dummy содержит следующий текст:
"bash introduction
howto test file"
$wc --words --lines --bytes /tmp/dummy
2 5 34 /tmp/dummy
wc не заботится о порядке параметров. Он всегда выводит их в стандартном порядке: <число;строк><число;слов><число;байтов><имя;файла>.
sort (сортирует строки текстового файла)

В этом случае, файл dummy содержит следующий текст:
"b
c
a"
$sort /tmp/dummy
Вывод выглядит следующим образом:
a
b
c
Команды не должны быть такими простыми:-)
bc (вычислительный язык программирования)
bc производит вычисления с командной строки (ввод из файла, но не через перенаправление или конвейер), а также из пользовательского интерфейса. Следующий пример показывает некоторые команды. Обратите внимание, что автор использовал bc с параметром -q, чтобы отказаться от вывода сообщения с приглашением.
$bc -q
1 == 5
0
0.05 == 0.05
1
5 != 5
0
2 ^ 8
256
sqrt(9)
3
while (i != 9) {
i = i + 1;
print i
}
123456789
quit
tput (инициализирует терминал или запрашивает базу данных terminfo)
Небольшая иллюстрация возможностей tput:

$tput cup 10 4
Приглашение командной строки появится в координатах (y10,x4).
$tput reset
Экран очищается и приглашение появляется в (y1,x1). Обратите внимание, что (y0,x0) - это левый верхний угол.
$tput cols
80 Отображает возможное количество символов в направлении по оси x.
Настоятельно рекомендуется быть с этими программами на "ты" (как минимум). Существует огромное количество небольших программ, которые предоставляют Вам возможность заняться настоящей магией в командной строке.
[Некоторые примеры были заимствованы из man-страниц или FAQ.]

Ещё скрипты

Применение команды ко всем файлам в каталоге.

Пример: очень простой скрипт резервного копирования (более эффективный)

#!/bin/bash
SRCD="/home/" #SRCD - SouRCe Directory - исходный каталог
TGTD="/var/backups/" #TGTD - TarGeT Directory - конечный каталог
OF=home-$(date +%Y%m%d).tgz #OF - Output File - выходной файл
tar -cZf $TGTD$OF $SRCD

Программа переименования файлов

#!/bin/sh
# renna: переименование нескольких файлов по специальным правилам
# Автор - felix hudson Jan - 2000

#Прежде всего, посмотрите на различные "режимы", которые имеются у этой программы.
#Если первый аргумент ($1) является подходящим, мы выполняем эту часть
#программы и выходим.

# Проверка на возможность добавления префикса.
if [ $1 = p ]; then

#Теперь переходим от переменной режима ($1) и префикса ($2)
prefix=$2 ; shift ; shift

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

if [$1 = ]; then

exit 0
fi

# Этот цикл for обрабатывает все файлы, которые мы задали
# программе.
# Он осуществляет одно переименование на файл.
for file in $*
do
mv ${file} $prefix$file
done

#После этого выполняется выход из программы.
exit 0
fi

# Проверка на условие добавления суффикса.
# В остальном, данная часть фактически идентична предыдущему разделу;
# пожалуйста, смотрите комментарии, содержащиеся в нем.
if [ $1 = s ]; then
suffix=$2 ; shift ; shift
if [$1 = ]; then
echo "не задано ни одного файла"
exit 0
fi
for file in $*
do
mv ${file} $file$suffix
done
exit 0
fi

# Проверка на условие переименования с заменой.
if [ $1 = r ]; then
shift
# Из соображений безопасности автор включил эту часть, чтобы не повредить ни один файл, если пользователь
# не определил, что следует выполнить:
if [ $# -lt 3 ] ; then
echo "Ошибка; правильный ввод: renna r [выражение] [замена] файлы... "
exit 0
fi

# Рассмотрим другую информацию
OLD=$1 ; NEW=$2 ; shift ; shift

# Данный цикл for последовательно проходит через все файлы, которые мы
# задали программе.
# Он совершает одно переименование на файл, используя программу "sed".
# Это простая программа с командной строки, которая анализирует стандартный
# ввод и заменяет регулярное выражение на заданную строку.
# Здесь мы задаём для sed имя файла (в качестве стандартного ввода) и заменяем
# необходимый текст.
for file in $*
do
new=`echo ${file} | sed s/${OLD}/${NEW}/g`
mv ${file} $new
done
exit 0
fi
# Если мы достигли этой строки, это означает, что программе были заданы
# неправильные параметры. В связи с этим, следует объяснить пользователю, как её
# использовать
echo "используйте:"
echo " renna p [префикс] файлы.."
echo " renna s [суффикс] файлы.."
echo " renna r [выражение] [замена] файлы.."
exit 0
# done!

Программа переименования файлов (простая)
#!/bin/bash
# renames.sh
# простая программа переименования

criteria=$1
re_match=$2
replace=$3

For i in $(ls *$criteria*);
do
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
mv $src $tgt
done

Если происходящее отличается от ожидаемого (отладка)

Каким образом можно вызвать BASH?

Было бы неплохо добавить в первую строку

#!/bin/bash -x
В результате этого будет выводиться некоторая интересная выходная информация.

О документе

Не следует стесняться вносить исправления, дополнения или что-либо ещё, если, по Вашему мнению, это должно присутствовать в этом документе. Автор постарается по возможности обновить его.

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

Оболочка Bash: введение

Оболочка, или шелл (shell) - это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal , eterm , nxterm и т. п.

Навигация

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

pwd

Команда pwd , сокращение от print working directory , отображает текущее местоположение в структуре каталогов.

cd

Команда cd позволяет перейти в новый каталог.

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 также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

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

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

Переменные окружения

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

Переменная 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 выводит много информации о права доступа к каждому файлу:

chmod

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

Вы можете вызвать 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

Следующая команда сработает так же, как и предыдущая.