Unix bash: Оболочка Bash — шпаргалка для начинающих

Содержание

Оболочка Bash — шпаргалка для начинающих

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

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

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

Навигация

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

pwd

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

cd

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

Синтаксис Объяснение
cd
Перемещение в домашний каталог
cd ~ Перемещение в домашний каталог
cd .. Перемещение на один уровень выше
cd - Перемещение в предыдущий каталог
cd Directory1 Перемещение в каталог Directory1
cd Directory1/Directory2 Перемещение в каталог Directory2 по указанному пути
mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

Основные команды

man

Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:

$ man cat
cat

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

Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.

echo

Команда echo выводит свои аргументы по стандартному каналу вывода.

$ echo Hello World
  Hello World

Если вызвать echo без аргументов, будет выведена пустая строка.

head

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:

$ head -50 test.txt
tail

Команда tail работает аналогично команде head, но читает строки с конца:

$ tail -50 test.txt

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

-f:

$ tail -f test.txt
less

Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.

$ less test.txt
$ ps aux | less

Подробнее о назначении символа | будет рассказано ниже в разделе команды history.

Обычные сочетания клавиш Описание
G Перемещает в конец файла
g Перемещает в начало файла
:50 Перемещает на 50 строку файла
q Выход из less
/searchterm Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки
/
Перемещает на следующий подходящий результат поиска
?searchterm Поиск строки, совпадающей с ‘searchterm’, выше текущей строки
? Перемещает на следующий подходящий результат поиска
up Перемещает на одну строку выше
down Перемещает на одну строку ниже
pageup Перемещает на одну страницу выше
pagedown Перемещает на одну страницу ниже
true

Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.

false

Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.

$?

$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):

$ true
$ echo $?
  0
$ false
$ echo $?
  1
grep

Команда grep занимается поиском переданной строки в указанном файле:

$ cat users.txt
  user:student password:123
  user:teacher password:321
$ grep 'student` file1.txt
  user:student password:123

grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

Обычные флаги Описание
-i Отключение чувствительности к регистру
-r Рекурсивный поиск по директориям
-w Поиск только целых слов
-c Вывод количества найденных элементов
-n Вывод всей строки, содержащей запрос
-v Вывод инвертированного совпадения

Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.

sed

Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g. Например, следующий код заменит все слова «Hello» на «Hi»:

$ cat test. txt
  Hello World
$ sed 's/Hello/Hi/g' test.txt
  Hi World

Также вы можете ознакомиться с руководством по sed.

history

Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++:

$ history | grep g++
  155  g++ file1.txt
  159  g++ file2.txt

Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды 

history, но увидим вывод команды grep.

Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами lshistoryps (описана ниже), перенаправляя их вывод в grepsed или less, например.

export

Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student:

$ export name=student
ps

Команда ps выводит информацию о запущенных процессах.

$ ps
  PID TTY          TIME CMD
  35346 pts/2    00:00:00 bash

Выводится четыре элемента:

  • ID процесса (PID),
  • тип терминала (TTY),
  • время работы процесса (TIME),
  • имя команды, запустившей процесс (CMD).
awk

Команда awk находит и заменяет текст в файлах по заданному шаблону: awk 'pattern {action}' test.txt

wget

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

$ wget https://github.com/mikeizbicki/ucr-cs100
nc

Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.

ping

Команда ping тестирует сетевое подключение.

$ ping google.com
  PING google.com (74.125.224.34) 56(84) bytes of data.
  64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms
  --- google.com ping statistics ---
  1 packets transmitted, 1 received, 0% packet loss, time 8ms
  rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms

Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.

git

Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.

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

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

Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.

Переменная HOME содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

Коннектор Описание
&& Первая команда исполняется всегда, вторая — только в случае успешного завершения первой
|| Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой
; Команды исполняются всегда
$ true && echo Hello
  Hello
$ false || echo Hello
  Hello
$ echo Hello ; ls
  Hello
  test.txt file1.txt file2.txt

Конвейеры

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

В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.

$ ls -l | head

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

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

Для стандартного перенаправления вывода используются символы > и >>.

Например, этот код передаст вывод ls в файл, а не на экран:

$ ls > files.txt
$ cat files.txt
  file1.cpp sample.txt

Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.

Перенаправление ввода

Для стандартного перенаправления вывода используется символ <. В следующем примере sort берет входные данные из файла, а не с клавиатуры:

$ cat files.txt
  c
  b
$ sort < files.txt
  b
  c

Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:

$ sort < files.txt > files_sorted.txt
Продвинутое перенаправление

Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr.

$ g++ test.cpp
$ ./a.out >& test.txt
$ cat test.txt
  stdout
  stderr

Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к >.

Имя Дескриптор Описание
stdin 0 Стандартный поток ввода
stdout 1 Стандартный поток вывода
stderr 2 Стандартный поток вывода ошибок

Например, для перенаправления stderr в test. txt нужно сделать следующее:

$ g++ test.cpp
$ ./a.out 2> test.txt
  stdout
$ cat test.txt
  stderr

Права доступа

Команда ls -l выводит много информации о правах доступа к каждому файлу:

$ ls -l test.txt
  -rw-rw-r--  1  user  group  1097374 January 26 2:48 test.txt
Вывод в примере Описание / возможные выводы
Тип файла:
- файл
d каталог
rw- Права доступа владельца файла
rw- Права доступа членов группы-владельца файла
r– Права доступа прочих пользователей
user Имя владельца файла
group Имя группы-владельца файла
chmod

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

Буква Пользователь
u Владелец
g Член группы
o Прочие пользователи
a Все пользователи

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

$ chmod ug+rw test.txt
$ ls -l test.txt
  -rw-rw----  1  user  group  1097374 January 26 2:48 test.txt

Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:

rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4

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

$ chmod 660 test. txt

Также можно ознакомиться с руководством по правам доступа.

Сочетания клавиш

Сочетание Описание
CTRL-A Перемещение курсора в начало строки
CTRL-E Перемещение курсора в конец строки
CTRL-R Поиск по истории
CTRL-W Вырезать последнее слово
CTRL-U Вырезать всё до курсора
CTRL-K Вырезать всё после курсора
CTRL-Y Вернуть последнюю вырезанную строку
CTRL-_ Отмена
CTRL-L Очистка экрана терминала

Не смешно? А здесь смешно: @ithumor

По материалам Bash-Cheatsheet

Введение в Linux и Bash. Курс

Курс «Введение в Linux и Bash» – серия статей-уроков, знакомящих с историей, особенностями и философией операционных систем GNU/Linux, принципами работы в режиме командной строки и основными командами, выполняемыми в Bash.

Курс будет полезен начинающим пользователям операционной системы GNU/Linux, будущим системным администраторам и веб-разработчикам, планирующим самостоятельно развертывать сайты на веб-серверах.

  • История Linux
    В статье кратко рассматриваются предпосылки возникновения операционной системы Linux и ее развитие: историческая значимость Unix, роль проекта GNU, как появилось ядро Linux и многообразие дистрибутивов.

  • GNU GPL
    GNU GPL — одна из разновидностей копилефт-лицензий для свободного программного обеспечения. GPL есть аббревиатура от General Public License — Универсальная Общественная Лицензия. В статье рассматриваются исторические причины появления копилефт-лицензий и преимущества открытого ПО.

  • Ядро Linux
    В статье описано, что такое ядро операционной системы, особенности Unix-подобных ядер, в том числе Linux.

  • Каталоги Linux
    Структура каталогов Linux отличается от Windows. В Linux на самом верхнем уровне файловой иерархии находится один единственный корневой каталог, обозначаемый косой чертой «/» (слэш). Другие диски монтируются в /media.

  • Типы файлов Linux
    Типы файлов Linux: обычные файлы (-), каталоги (d), символьные ссылки (l), символьные (c) и блочные (b) устройства, каналы (p) и сокеты (s). В Linux расширение файла не несет информации для ОС о типе файла.

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

  • Bash – командная оболочка Linux
    Bash — это наиболее распространенная командная оболочка для Linux. Bash позволяет работать в интерфейсе командной строки операционной системы, отдавая команды в интерактивном режиме.

  • Параметры команд
    Команды Bash могут содержать параметры. Ключи, или опции, модифицируют работу программы. Аргументы, или операнды, — то, над чем выполняется команда.

  • Ctrl + C, Ctrl + D, Ctrl + Z
    В терминале Ctrl + C и Ctrl + D прерывают работу программ, Ctrl + Z — останавливает и переводит в фоновый режим. Чтобы сделать фоновую задачу текущей, используется команда fg. Для удаления процессов — команда kill.

  • История команд и автодополнение
    В Bash история команд прокручивается стрелками вверх и вниз, для автозавершения команд и адресов используется Tab — клавиша табуляции.

  • Перенаправление ввода-вывода
    В Bash с помощью знака больше «>» вывод команды можно перенаправить в файл. С помощью знака меньше изменяется стандартный поток ввода.

  • Документация Linux
    В Bash доступ к документации программ GNU/Linux можно получить с помощью программ man, info, ключа —help. Man-страницы имеют строгую структуру, info — неофициальная документация.

  • Абсолютная и относительная адресация. Команда cd
    Для перехода по дереву каталогов в Bash используется команда cd, которая в качестве аргумента принимает абсолютный или относительный адрес каталога.

  • Команда ls – просмотр каталога
    Команда ls используется в командной оболочке Linux для вывода содержимого каталогов и информации о файлах. У программы ls есть много ключей, позволяющих получать о файлах более подробную информацию, а также выводить ее в различных форматах.

  • Копирование, перемещение, создание и удаление файлов и каталогов
    В командной оболочке Bash команда cp копирует файл, mv — перемещает и переименовывает, mkdir — создает каталог, rm — удаляет. При копировании и перемещении сначала указывается источник, потом место назначения.

  • Жесткие и символьные ссылки
    В Linux каждый файл идентифицируется числовым индексным дескриптором. Имена файлов указывают на дескрипторы и являются жесткими ссылками. Символьные ссылки указывают на жесткие ссылки.

  • Создание ссылок в Linux
    В командной оболочке Linux жесткие ссылки на файлы создаются с помощью команды ln. Для создания символьных ссылок на файлы и каталоги используется команда ln -s.

  • Права доступа
    В Unix-подобных ОС для файлов устанавливаются биты прав доступа на чтение, изменение и выполнение по отношению к трем категориям: владельцу, группе и остальным.

  • Команда chmod – изменение прав доступа
    С помощью команды chmod изменяют права доступа к файлам и каталогам. Может использоваться как символьный, так и числовой способ назначения прав.

  • Шаблоны имен файлов
    В шаблонах имен файлов любое количество любых символов обозначается звездочкой *. Любой один символ — знаком вопроса ?. Если надо задать только определенные допустимые символы, то используются квадратные скобки [].

  • Поиск файлов. Команда find
    В Bash поиск файлов выполняется командой find. Сначала указывается каталог, потом свойство и его значение. Например, find . -name «*.html» ищет файлы html в текущем каталоге.

  • Команда sudo – администрирование системы
    Утилита sudo позволяет выполнить команду с правами администратора системы. В Bash сначала пишется sudo, затем команда и ее параметры.

  • Пакетный менеджер APT
    В Linux установка программ выполняется с помощью пакетных менеджеров. Наиболее популярным является apt. Команда установки: apt install. Команда удаления: apt remove.

  • Команда source в Bash

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

    source это оболочка, встроенная в Bash и другие популярные оболочки, используемые в операционных системах Linux и UNIX. Его поведение может немного отличаться от оболочки к оболочке.

     

    Синтаксис команды source следующий:

    source FILENAME [ARGUMENTS]
    . FILENAME [ARGUMENTS]
    • source и .(точка) – это одна и та же команда.
    • Если FILENAME путь к файлу не полный, команда выполнит поиск файла в каталогах, указанных в переменной среды $PATH. Если файл не найден в команде $PATH, будет выполнен поиск файла в текущем каталоге.
    • Если ARGUMENTS они заданы, они станут позиционными параметрами для FILENAME.
    • Если FILENAME существует sourceкод завершения команды 0, в противном случае, если файл не найден, он вернется 1.

     

    В этом разделе мы рассмотрим некоторые основные примеры использования команды source.

     

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

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

    functions.sh

    check_root () {
      if [[ $EUID -ne 0 ]]; then
        echo "Этот сценарий должен выполняться от имени root" 
        exit 1
      fi
    }

     

    Теперь в каждом из ваших сценариев, которые должны запускаться только пользователем root, просто создайте файл functions.sh и вызовите функцию:

    #!/usr/bin/env bash
    
    source functions.sh
    check_root
    
    echo "я root"

     

    Если вы запустите приведенный выше сценарий как пользователь без полномочий root, он напечатает «Этот сценарий должен быть запущен от имени пользователя root» и завершится.

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

     

    С помощью команды source вы также можете читать переменные из файла. Переменные должны быть установлены с использованием синтаксиса VARIABLE=VALUE в Bash.

    Давайте создадим тестовый файл конфигурации:

    config.sh

    В вашем bash-скрипте используйте команду source для чтения файла конфигурации:

    #!/usr/bin/env bash
    
    source config.sh
    
    echo "VAR1 is $VAR1"
    echo "VAR2 is $VAR2"

     

    Если вы запустите скрипт, результат будет выглядеть так:

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

    Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    Linux / Unix: “-bash: python: command not found”

    Предположим я новичок и пытаюсь запустить программу на Python. У меня есть облако на основе VM / VPS и когда я запускаю mycode.py на терминале моего сервера, я получаю следующее сообщение об ошибке:

    -bash: Python: команда не найдена

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

    Проверьте путь питона

    Введите одну из команд для проверки существования бинарного файла pyrhon на Linux / Unix

    type -a python

    или

    ls -l /usr/bin/python
    ls -l /usr/bin/python*

    или

    which python

    Пример результата

    Кажется, что Python отсутствует по неизвестной причине или не был установлен провайдером, чтобы сэкономить дисковое пространство. Как установить его в соответствии с вашим дистрибутивом Linux или Unix вариант:

    Ubuntu / Debian / Mint Linux установка Python

    Ввкдите следующую команду apt-get  или apt

    $ sudo apt-get install python

    Или установить версию пиона 3:

    $ sudo apt-get install python3

    Oracle / RHEL (Red Hat) / CentOS Linux установить Python

    Введите следующую команду :

    $ sudo yum install python

    Fedora Linux установить Python

    Введите следующую команду DNF, чтобы добавить v2.x Python:

    $ sudo dnf install python

    ИЛИ добавить Python v3.x:

    $ sudo dnf install python3

    Arch Linux установка Python

    Введите следующую команду pacman, чтобы добавить v2.x Python:

    $ sudo pacman -S python2

    ИЛИ добавить v3.x Python:

    $ sudo pacman -S python3

    Suse / OpenSUSE Linux установка Python

    Введите следующую команду, чтобы добавить v2.x Python:

    $ sudo zypper install python

    ИЛИ добавить v3.x Python:

    $ sudo zypper install python3

    FreeBSD Unix установка Python

    Введите следующую команду PKG, чтобы добавить v2. x Python:

    # pkg install python2

    ИЛИ Чтобы установить порт Python V2.x:

    # cd /usr/ports/lang/python2/ && make install clean

    Для того, чтобы добавить пакет Python v3.x:

    # pkg install python3

    ИЛИ Чтобы установить порт Python v3.x:

    # cd /usr/ports/lang/python3/ && make install clean

    OpenBSD Unix установка Python

    Введите следующую команду pkg_add, чтобы добавить v2.x Python или 3.x:

    # pkg_add python

    ИЛИ

    $ doas pkg_add python

    Примеры результатов:

    quirks-2.241 signed on 2016-07-26T16:56:10Z
    Ambiguous: choose package for python
    a       0: 
            1: python-2.7.12
            2: python-3.4.5
            3: python-3.5.2
    Your choice:

    MacOS X Unix установка python3

    Введите следующую команду:

    $ brew install python3

    Проверка правильности установки Python

    Введите следующие команды:

    $ type -a python 
    $ which python 
    $ ls -l /usr/bin/python 
    $ ls -l /usr/bin/python*

    Примеры результатов:

    Примечание о сломанном линке

    Иногда символические ссылки на исполняемые файлы питонов ломаются по какой-то причине. Например, /usr/bin/python3.4 это реальные исполняемые файлы. Вы можете указать/usr/bin/python на /usr/bin/python3.4 для Python версии 3.4 с помощью команды LN:

    $ sudo ln -s /usr/bin/python3.4 /usr/bin/python

    Теперь вы можете запустить программу:

    $ python mycode.py

    Предоставляем услуги администрирования серверов и DevOps инженеров

    Проект документации Linux


    Информация о LDP
    FAQ
    Манифест / лицензия
    История
    Волонтеры / сотрудники
    Должностные инструкции
    Списки рассылки
    IRC
    Обратная связь

    Автор / внести свой вклад
    Руководство для авторов LDP
    Внесите свой вклад / помогите
    Ресурсы
    Как отправить
    Репозиторий GIT
    Загрузок
    Контакты

    Спонсор сайта LDP
    Мастерская

    LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
    Члены | Авторы | Посетители
    Документы

    HOWTO : тематическая справка
    последние обновления | основной индекс | просматривать по категориям
    Руководства : более длинные, подробные книги
    последние обновления / основной индекс
    Часто задаваемые вопросы : Часто задаваемые вопросы
    последние обновления / основной индекс
    страницы руководства : справка по отдельным командам (20060810)
    Бюллетень Linux : Интернет-журнал
    Поиск / Ресурсы

    Ссылки
    Поиск OMF
    Объявления / Разное


    Обновления документов
    Ссылка на HOWTO, которые были недавно обновлены.

    Проект документации Linux


    Информация о LDP
    FAQ
    Манифест / лицензия
    История
    Волонтеры / сотрудники
    Должностные инструкции
    Списки рассылки
    IRC
    Обратная связь

    Автор / внести свой вклад
    Руководство для авторов LDP
    Внесите свой вклад / помогите
    Ресурсы
    Как отправить
    Репозиторий GIT
    Загрузок
    Контакты

    Спонсор сайта LDP
    Мастерская

    LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
    Члены | Авторы | Посетители
    Документы

    HOWTO : тематическая справка
    последние обновления | основной индекс | просматривать по категориям
    Руководства : более длинные, подробные книги
    последние обновления / основной индекс
    Часто задаваемые вопросы : Часто задаваемые вопросы
    последние обновления / основной индекс
    страницы руководства : справка по отдельным командам (20060810)
    Бюллетень Linux : Интернет-журнал
    Поиск / Ресурсы

    Ссылки
    Поиск OMF
    Объявления / Разное


    Обновления документов
    Ссылка на HOWTO, которые были недавно обновлены.

    Проект документации Linux


    Информация о LDP
    FAQ
    Манифест / лицензия
    История
    Волонтеры / сотрудники
    Должностные инструкции
    Списки рассылки
    IRC
    Обратная связь

    Автор / внести свой вклад
    Руководство для авторов LDP
    Внесите свой вклад / помогите
    Ресурсы
    Как отправить
    Репозиторий GIT
    Загрузок
    Контакты

    Спонсор сайта LDP
    Мастерская

    LDP Wiki : LDP Wiki — это отправная точка для любой незавершенной работы
    Члены | Авторы | Посетители
    Документы

    HOWTO : тематическая справка
    последние обновления | основной индекс | просматривать по категориям
    Руководства : более длинные, подробные книги
    последние обновления / основной индекс
    Часто задаваемые вопросы : Часто задаваемые вопросы
    последние обновления / основной индекс
    страницы руководства : справка по отдельным командам (20060810)
    Бюллетень Linux : Интернет-журнал
    Поиск / Ресурсы

    Ссылки
    Поиск OMF
    Объявления / Разное


    Обновления документов
    Ссылка на HOWTO, которые были недавно обновлены.

    Что такое Bash? | Opensource.com

    Когда компьютер загружается, ядро ​​(будь то Linux, BSD, Mach или NT) распознает все физическое оборудование и позволяет каждому компоненту взаимодействовать друг с другом и управлять им с помощью некоторого базового программного обеспечения. Самый простой набор инструкций компьютера просто поддерживает его включенным и в безопасном состоянии: периодическая активация вентиляторов для предотвращения перегрева, использование подсистем для мониторинга дискового пространства или «прослушивания» новых подключенных устройств и т. Д.Если бы это были все компьютеры, они были бы столь же интересны, как конвекционная печь.

    Ученые-компьютерщики осознали это рано, поэтому они разработали оболочку для компьютеров Unix, которая работает вне ядра (или вокруг ядра , как оболочка в природе) и позволяет людям взаимодействовать с компьютером, когда они хотят . Это было захватывающим событием в то время, когда люди загружали в компьютеры перфокарты, чтобы указывать им, что делать. Из всех доступных оболочек Bash — одна из самых популярных, самых мощных и дружелюбных.

    Bash — это приложение

    Когда вы запускаете терминал (например, терминал GNOME или Konsole в Linux или iTerm2 в macOS) с оболочкой Bash, вас встречает приглашение . Подсказка — это символ, обычно знак доллара ( $ ), указывающий, что оболочка ожидает вашего ввода. Конечно, совсем другое дело — знать, что вы должны печатать.

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

    [Загрузите нашу бесплатную шпаргалку по Bash]

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

    Команды Linux

    В Linux и Unix (например, BSD и macOS) большинство команд по умолчанию хранятся в системных каталогах, таких как / usr / bin и / bin . По своей природе Bash знает эти команды не больше, чем вы, естественно, знаете клингонский диалект, но так же, как вы можете искать клингонские слова, Bash может искать команды.Когда вы вводите команду для Bash, он ищет определенные каталоги в вашей системе, чтобы узнать, существует ли такая команда. Если команда существует, Bash выполняет ее.

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

     

    $ который bash
    / usr / bin / bash
    $ который ls
    / usr / bin / ls

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

     

    $ который bash
    который: нет компакт-диска в (/ usr / local / bin: / usr / bin: / bin:
    [...]

    Они все еще доступны, потому что они встроены в Bash, а Bash — это то, что вы используете.

    Запуск Bash

    Большинство современных дистрибутивов Linux и Unix по умолчанию предоставляют оболочку Bash. Они делают это, потому что Bash хорошо известен и имеет несколько удобных функций, которых нет в других оболочках. Однако в некоторых системах по умолчанию используется другая оболочка. Чтобы узнать, используете ли вы оболочку Bash, вы можете использовать команду echo вместе со специальной переменной, представляющей имя текущего запущенного процесса:

     

    Если вы не используете Bash, но хотите его попробовать, вы, вероятно, можете загрузить и установить Bash из своего программного центра, репозитория программного обеспечения или дерева портов.Или вы можете использовать Chocolatey в Windows или Homebrew в macOS. Если ничего не помогает, посетите домашнюю страницу Bash для получения дополнительной информации.

    Работа в Bash

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

    Существуют сотни команд для Linux и Unix, и вы можете удивиться, насколько они разнообразны.x800 \
    -Центр тяжести \
    -crop 1600×800 + 0 + 0 myphoto.jpg

    Вы можете воспроизводить музыку с помощью таких команд, как ogg123 или mpg321 , конвертировать аудио с sox , настраивать и редактировать видео с помощью ffmpeg , редактировать текст с помощью emacs или vim , проверять электронную почту с сосна или mutt , просматривайте Интернет с помощью elinks , просматривайте файлы с помощью ranger или midnightcommander и многое, многое другое.Все это делается в Bash с помощью команд, которые вы найдете в своей системе или в репозитории программного обеспечения.

    Bash скрипты

    Одна из причин, по которой Bash (и Linux в целом) считается настолько мощным, заключается в том, что он поддерживает сценарии. Все, что вы можете ввести в Bash вручную, вы также можете перечислить в текстовом файле и запустить его за вас. Вместо того, чтобы тратить полдня на ручное выполнение сотни команд, вы можете написать сценарий команд и заставить ваш компьютер выполнять их, пока вы будете заниматься более важными делами.Поскольку почти все в Linux работает поверх оболочки Bash, почти все в Linux можно создать с помощью сценария Bash. Хотя есть исключения из этого правила (например, графические приложения могут иметь свой собственный язык сценариев или вообще не иметь сценариев), создание сценариев для вашей ОС открывает десятки тысяч возможных функций, которые вы можете реализовать на своем компьютере, не выполняя их самостоятельно.

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

    Когда опытные пользователи говорят, что хотят изучить Bash, если они не имеют в виду, что хотят изучать команды Linux, они, вероятно, имеют в виду, что они хотят улучшить способ написания своих команд. Например, это крайне рудиментарный сценарий Bash, который преобразует временный файл (представьте, что это файл, созданный отдельным процессом) в определенный каталог:

     #! / Usr / bin / bash 

    cp tmp.png ~ / public_html / `date +% Y% m% d`.png

    Это правильный Bash.Вы можете проверить это, скопировав и вставив команду (последняя строка, начинающаяся с cp ) в терминал. Пока есть файл с именем tmp.png и каталог с именем ~ / public_html , команда работает.

    Однако

    Learning Bash — это понимание того, как можно улучшить такую ​​простую команду для автоматизации. Например, если файл tmp.png не существует, сценарий завершается ошибкой. Если этот сценарий является ключевым компонентом, например, для сайта блогов, которому каждый день требуется новое изображение, чтобы можно было создать настраиваемое изображение заголовка, то сбой сценария может вызвать катастрофические ошибки в другом месте. Пользователь, знакомый с Bash, может повысить отказоустойчивость, используя синтаксис Bash:

    .
     #! / Usr / bin / bash 

    IMG = "tmp.png"

    [[-e tmp.png]] || IMG = "generic.png"

    cp ~ / "$ {IMG}" ~ / public_html / `date +% Y% m% d`.png

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

    Преимущества Bash

    Bash так же мощен, как и другие оболочки, но добавляет вспомогательные функции, такие как двойные скобки ( [[ и ]] ) в примере кода.Эти «башизмы» очень нравятся пользователям Bash, потому что они избегают иногда многословного и неудобного синтаксиса в других оболочках, таких как tcsh или ash. Однако они уникальны для Bash и не совместимы с POSIX, что может вызвать проблемы совместимости в системах, на которых не работает Bash. Опять же, Bash — это бесплатное программное обеспечение с открытым исходным кодом, поэтому большинство пользователей могут установить его, если оно им нужно. Отсутствие совместимости только вызывает дополнительную зависимость и никого не исключает из использования сценария.

    Learning Bash

    Если вы хотите изучить Bash, вы можете прочитать любое количество замечательных книг по этой теме.

    Или вы можете пройти онлайн-курс на EdX.org и даже присоединиться к некоторым бесплатным курсам Red Hat.

    Лучше всего то, что вы также можете играть в игры, чтобы изучить Bash.

    Удачи и удачи!

    Сценарии оболочки — оболочка Unix

    Обзор

    Обучение: 30 мин.
    Упражнения: 15 мин.

    Цели
    • Напишите сценарий оболочки, который запускает команду или серию команд для фиксированного набора файлов.

    • Запустить сценарий оболочки из командной строки.

    • Напишите сценарий оболочки, который работает с набором файлов, определенным пользователем в командной строке.

    • Создавайте конвейеры, включающие сценарии оболочки, написанные вами и другими.

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

    Давайте начнем с того, что вернемся к молекулам / и создадим новый файл, middle.sh , который будет стать нашим сценарием оболочки:

      $ cd молекул
    $ nano middle.sh
      

    Команда nano middle.sh открывает файл middle.sh в текстовом редакторе «nano» (который работает внутри оболочки).Если файл не существует, он будет создан. Мы можем использовать текстовый редактор для непосредственного редактирования файла — мы просто вставим следующую строку:

      head -n 15 octane.pdb | хвост -n 5
      

    Это вариант трубы, которую мы построили ранее: он выбирает строки 11-15 файла octane.pdb . Помните, что мы , а не , пока запускаем его как команду: мы помещаем команды в файл.

    Затем сохраняем файл ( Ctrl-O в нано), и выйдите из текстового редактора ( Ctrl-X в nano).Убедитесь, что в каталоге Molecules теперь есть файл с именем middle.sh .

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

      АТОМ 9 H 1 -4,502 0,681 0,785 1,00 0,00
    АТОМ 10 H 1 -5,254 -0,243 -0,537 1,00 0,00
    АТОМ 11 H 1 -4,357 1,252 -0,895 1,00 0,00
    АТОМ 12 Ч 1 -3.009 -0,741 -1,467 1,00 0,00
    АТОМ 13 H 1 -3,172 -1,337 0,206 1,00 0,00
      

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

    Текст против чего угодно

    Обычно мы называем такие программы, как Microsoft Word или LibreOffice Writer «текстовыми. редакторы », но нам нужно быть немного осторожнее, когда дело доходит до программирование. По умолчанию Microsoft Word использует файлов .docx для хранения не только текст, но также информацию о форматировании шрифтов, заголовков и т. д. на.Эта дополнительная информация не хранится в виде символов и не означает что-нибудь для таких инструментов, как head : они ожидают, что входные файлы будут содержать ничего, кроме букв, цифр и знаков препинания на стандартном компьютере клавиатура. Поэтому при редактировании программ вы должны либо использовать простой текстовый редактор или сохраняйте файлы как обычный текст.

    Что, если мы хотим выбрать строки из произвольного файла? Мы можем редактировать middle.sh каждый раз, чтобы изменить имя файла, но это, вероятно, займет больше времени, чем повторный ввод команды в оболочке и запустив его с новым именем файла.Вместо этого давайте отредактируем middle.sh и сделаем его более универсальным:

    Теперь в «nano» замените текст octane.pdb специальной переменной под названием $ 1 :

      головка -н 15 "1 $" | хвост -n 5
      

    Внутри сценария оболочки, $ 1 означает «первое имя файла (или другой аргумент) в командной строке». Теперь мы можем запустить наш скрипт следующим образом:

      $ bash middle.sh octane.pdb
      
      ATOM 9 H 1-4.502 0,681 0,785 1,00 0,00
    АТОМ 10 H 1 -5,254 -0,243 -0,537 1,00 0,00
    АТОМ 11 H 1 -4,357 1,252 -0,895 1,00 0,00
    АТОМ 12 H 1 -3,009 -0,741 -1,467 1,00 0,00
    АТОМ 13 H 1 -3,172 -1,337 0,206 1,00 0,00
      

    или в другом файле, например:

      $ bash middle.sh pentane.pdb
      
      ATOM 9 H 1 1,324 0,350 -1,332 1,00 0.00
    АТОМ 10 H 1 1,271 1,378 0,122 1,00 0,00
    АТОМ 11 H 1 -0,074 -0,384 1,288 1,00 0,00
    АТОМ 12 H 1 -0,048 -1,362 -0,205 1,00 0,00
    АТОМ 13 H 1 -1,183 0,500 -1,412 1,00 0,00
      

    Двойные кавычки вокруг аргументов

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

    В настоящее время нам нужно редактировать middle.sh каждый раз, когда мы хотим настроить диапазон строки, которые возвращаются. Давайте исправим это, настроив наш скрипт на использование трех аргументов командной строки. После первого аргумента командной строки ( $ 1 ) каждый дополнительный аргумент, который мы provide будет доступен через специальные переменные $ 1 , $ 2 , $ 3 , которые относятся к первому, второму и третьему аргументам командной строки соответственно.

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

      голова -n "2 доллара" "1 доллар" | tail -n "$ 3"
      

    Теперь мы можем запустить:

      $ bash middle.sh pentane.pdb 15 5
      
      АТОМ 9 H 1 1,324 0,350 -1,332 1,00 0,00
    АТОМ 10 H 1 1,271 1,378 0,122 1,00 0,00
    АТОМ 11 Ч 1 -0.074 -0,384 1,288 1,00 0,00
    АТОМ 12 H 1 -0,048 -1,362 -0,205 1,00 0,00
    АТОМ 13 H 1 -1,183 0,500 -1,412 1,00 0,00
      

    Изменяя аргументы нашей команды, мы можем изменить наш скрипт поведение:

      $ bash middle.sh pentane.pdb 20 5
      
      АТОМ 14 H 1 -1,259 1,420 0,112 1,00 0,00
    АТОМ 15 H 1 -2,608 -0,407 1,130 1,00 0,00
    АТОМ 16 H 1-2.540 -1,303 -0,404 1,00 0,00
    АТОМ 17 H 1 -3,393 0,254 -0,321 1,00 0,00
    ТЕР 18 1
      

    Это работает, но следующему человеку, который прочитает middle.sh , может потребоваться мгновение, чтобы понять, что он делает. Мы можем улучшить наш скрипт, добавив комментариев вверху:

      # Выбрать строки из середины файла.
    # Использование: bash middle.sh имя_файла end_line num_lines
    голова -n "$ 2" "$ 1" | tail -n "$ 3"
      

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

    Что, если мы хотим обрабатывать много файлов в одном конвейере? Например, если мы хотим отсортировать наши файлы .pdb по длине, мы должны ввести:

    , потому что wc -l перечисляет количество строк в файлах (напомним, что wc означает «количество слов», добавление опции -l вместо этого означает «подсчет строк») и sort -n сортирует вещи численно.Мы могли бы поместить это в файл, но тогда он будет отсортировать только список из файлов .pdb в текущем каталоге. Если мы хотим получить отсортированный список файлов других типов, нам нужен способ включить все эти имена в сценарий. Мы не можем использовать $ 1 , $ 2 и т. Д. потому что мы не знаем, сколько там файлов. Вместо этого мы используем специальную переменную $ @ , что значит, «Все аргументы командной строки для сценария оболочки». Мы также должны заключить $ @ в двойные кавычки. для обработки случая аргументов, содержащих пробелы ( "$ @" — это специальный синтаксис, эквивалентный "$ 1" "$ 2" …).

    Вот пример:

      # Сортировка файлов по длине.
    # Использование: bash sorted.sh one_or_more_filenames
    wc -l "$ @" | sort -n
      
      $ bash sorted.sh * .pdb ../creatures/*.dat
      
      9 methane.pdb
    12 ethane.pdb
    15 пропан.pdb
    20 cubane.pdb
    21 pentane.pdb
    Октановое число 30.pdb
    163 ../creatures/basilisk.dat
    163 ../creatures/minotaur.dat
    163 ../creatures/unicorn.dat
    596 Всего
      

    Список уникальных видов

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

      05.11.2013, олень, 5
    2013-11-05, кролик, 22
    2013-11-05, енот, 7
    2013-11-06, кролик, 19
    2013-11-06, Олень, 2
    2013-11-06, лиса, 1
    2013-11-07, кролик, 18
    2013-11-07, медведь, 1
      

    Пример файла этого типа приведен в data-shell / data / animal-counts / animals.txt .

    Мы можем использовать команду cut -d, -f 2 animals.txt | сортировать | uniq для создания уникальных видов животных в .txt . Чтобы избежать необходимости каждый раз вводить эту серию команд, ученый может вместо этого написать сценарий оболочки.

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

    Решение

      # Скрипт для поиска уникальных видов в файлах csv, где вид - второе поле данных
    # Этот скрипт принимает любое количество имен файлов в качестве аргументов командной строки
    
    # Перебрать все файлы
    для файла в $ @
    делать
    echo "Уникальные виды в $ file:"
    # Извлечь названия видов
    вырезать -d, -f 2 $ файл | сортировать | уникальный
    сделано
      

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

      $ история | хвост -n 5> повторить-figure-3.sh
      

    Файл redo-figure-3.sh теперь содержит:

      297 bash goostats NENE01729B.txt stats-NENE01729B.txt
    298 bash goodiff stats-NENE01729B.txt /data/validated/01729.txt> 01729-sizes.txt
    299 cut -d ',' -f 2-3 01729-разницы.txt> 01729-time-series.txt
    300 ygraph --format scatter --color bw --borders none 01729-time-series.txt figure-3.png
    301 история | хвост -n 5> повторить-figure-3.sh
      

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

    Зачем записывать команды в историю перед их запуском?

    Если вы запустите команду:

      $ история | хвост -n 5> недавний.ш
      

    последняя команда в файле — это сама команда history , т.е. оболочка добавила историю в журнал команд до того, как запустил это. На самом деле оболочка всегда добавляет команды в журнал перед их запуском. Как вы думаете, почему он это делает?

    Решение

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

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

    Конвейер Нелле: создание сценария

    Начальник Нелле настаивал на том, чтобы все ее аналитические данные были воспроизводимы. Самый простой способ зафиксировать все шаги — в сценарии.

    Сначала мы вернемся в каталог данных Нелле:

      $ cd ../north-pacific-gyre/2012-07-03/
      

    Она запускает редактор и пишет следующее:

      # Вычислить статистику для файлов данных.
    для файла данных в "$ @"
    делать
        echo $ datafile
        bash goostats $ datafile stats- $ datafile
    сделано
      

    Она сохраняет это в файле под названием do-stats.sh так что теперь она может повторно провести первый этап своего анализа, набрав:

      $ bash do-stats.sh NENE * [AB] .txt
      

    Она также может это сделать:

      $ bash do-stats.sh NENE * [AB] .txt | туалет -l
      

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

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

      # Рассчитать статистику для файлов данных сайта A и сайта B.для файла данных в NENE * [AB] .txt
    делать
        echo $ datafile
        bash goostats $ datafile stats- $ datafile
    сделано
      

    Преимущество в том, что при этом всегда выбираются правильные файлы: ей не нужно помнить об исключении файлов «Z». Недостаток в том, что всегда выбирает только эти файлы — она ​​не может запустить его для всех файлов. (включая файлы «Z»), или в файлах «G» или «H», которые создают ее коллеги в Антарктиде, без редактирования скрипта. Если бы она хотела быть более предприимчивой, она могла изменить свой сценарий, чтобы проверить аргументы командной строки, и используйте NENE * [AB].txt , если ничего не было предоставлено. Конечно, это означает еще один компромисс между гибкостью и сложностью.

    Переменные в сценариях оболочки

    Представьте, что в каталоге молекул у вас есть сценарий оболочки с именем script.sh , содержащий следующие команды:

      голов -н $ 2 $ 1
    хвост -n $ 3 $ 1
      

    Находясь в каталоге Molecules , вы набираете следующую команду:

      сценарий bash.sh '* .pdb' 1 1
      

    Какой из следующих результатов вы ожидаете увидеть?

    1. Все строки между первой и последней строками каждого файла, заканчивающиеся на .pdb в молекулах каталоге
    2. Первая и последняя строки каждого файла, заканчивающиеся на .pdb в каталоге молекул
    3. Первая и последняя строка каждого файла в каталоге молекул
    4. Ошибка из-за кавычек около *.pdb

    Решение

    Правильный ответ — 2.

    Специальные переменные $ 1, $ 2 и $ 3 представляют аргументы командной строки, передаваемые скрипт, так что выполняются следующие команды:

      $ напор -n 1 кубан.pdb этан.pdb октан.pdb пентан.pdb пропан.pdb
    $ tail -n 1 cubane.pdb ethane.pdb octane.pdb pentane.pdb propane.pdb
      

    Оболочка не расширяет '* .pdb' , потому что он заключен в кавычки.Таким образом, первый аргумент сценария — '* .pdb' , который раскрывается в пределах скрипт от голова и хвост .

    Найти самый длинный файл с заданным расширением

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

      $ bash самый длинный.ш / тмп / данные PDB
      

    напечатает имя файла .pdb в / tmp / data , который имеет самые строки.

    Решение

      # Сценарий оболочки, который принимает два аргумента:
    # 1. имя каталога
    # 2. расширение файла
    # и печатает имя файла в этом каталоге
    # с наибольшим количеством строк, соответствующих расширению файла.
    
    туалет -l $ 1 /*.$ 2 | sort -n | хвост -n 2 | голова -n 1
      

    Первая часть трубопровода, сан.узел-1 $ / *.$ 2 | sort -n , считает строки в каждом файле и сортирует их по номерам (самый большой последний). Когда имеется более одного файла, wc также выводит итоговую итоговую строку, что дает общее количество строк в всех файлах. Используем хвост -n 2 | head -n 1 , чтобы выбросить эту последнюю строку.

    С унитазом -l $ 1 /*.$ 2 | sort -n | tail -n 1 мы увидим окончательную сводку line: мы можем построить наш конвейер по частям, чтобы убедиться, что мы понимаем выход.

    Понимание чтения сценария

    Для ответа на этот вопрос рассмотрим еще раз каталог data-shell / modules . Он содержит ряд файлов .pdb в дополнение к любым другим файлам, которые вы возможно создали. Объясните, что будет делать каждый из следующих трех сценариев при запуске от имени bash script1.sh * .pdb , bash script2.sh * .pdb и bash script3.sh * .pdb соответственно.

      # Скрипт 2
    для имени файла в $ 1 $ 2 $ 3
    делать
        cat $ filename
    сделано
      

    Решения

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

    Сценарий 1 распечатает список всех файлов, в имени которых есть точка. Аргументы, переданные в скрипт, фактически нигде в скрипте не используются.

    Сценарий 2 распечатает содержимое первых 3 файлов с расширением .pdb . $ 1 , $ 2 и $ 3 относятся к первому, второму и третьему аргументу соответственно.

    Сценарий 3 распечатает все аргументы сценария (т.е.е. все файлы .pdb ), за которым следует .pdb . $ @ относится к всем аргументам, передаваемым сценарию оболочки.

      cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb.pdb
      

    Сценарии отладки

    Предположим, вы сохранили следующий сценарий в файле с именем do-errors.sh в Nelle’s north-pacific-круговорот / 2012-07-03 каталог:

      # Вычислить статистику для файлов данных.для файла данных в "$ @"
    делать
        echo $ datfile
        bash goostats $ datafile stats- $ datafile
    сделано
      

    При запуске:

      $ bash do-errors.sh NENE * [AB] .txt
      

    вывод пустой. Чтобы выяснить, почему, повторно запустите скрипт с параметром -x :

      bash -x do-errors.sh NENE * [AB] .txt
      

    Что вам показывает вывод? Какая строка отвечает за ошибку?

    Решение

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

    Ключевые моменты

    • Сохранение команд в файлах (обычно называемых сценариями оболочки) для повторного использования.

    • bash [имя файла] запускает команды, сохраненные в файле.

    • $ @ относится ко всем аргументам командной строки сценария оболочки.

    • $ 1 , $ 2 и т. Д. Относятся к первому аргументу командной строки, второму аргументу командной строки и т. Д.

    • Поместите переменные в кавычки, если в значениях могут быть пробелы.

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

    Bash Scripting: все, что вам нужно знать о программировании на Bash-оболочке | Удай Хиварале | Системный сбой

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

    1. Псевдонимы в Bash

    Мы можем создать псевдоним команды, используя команду alias . Например, чтобы получить более подробный список файлов, мы используем команду ls -alh . Мы можем сократить его, определив псевдоним ll , как показано ниже.

     ~  $ псевдоним  ll = "ls -alh" 
    ~ $ ll
    drwxr-xr-x 11 Uday.Hiwarale staff 352B 7 сен 20:10.
    drwxr-xr-x 4 Uday.Hiwarale Staff 128B 4 сен 06:38 ..
    -rw-r - r - @ 1 Uday.Hiwarale Staff 6.0K 6 сен 12:45 photo.txt

    2.

    команда типа

    тип — это встроенная команда оболочки для просмотра типа ключевого слова или команды.

    https://gist.github.com/thatisuday/1365d0e0be1d086799697db4bd18a62c

    3.Одновременное выполнение нескольких команд

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

     #  &&: Выполнить следующую команду, если предыдущая команда выполнена успешно  
    true && echo "1: Напечатано"
    false && echo "1: Это не будет напечатано" # || : Выполнять команды до тех пор, пока одна из них не будет успешной
    false || echo "2: Распечатано"
    true || echo «2: Это не будет напечатано» # ; : Выполнить все команды (только разделитель операторов)
    false; echo «2A: напечатано»
    true; echo «2B: напечатано» ⥤ 1: напечатано
    ⥤ 2: напечатано
    ⥤ 2A: напечатано
    ⥤ 2B: напечатано

    Мы можем передать STDOUT команды STDIN другой команды, используя | оператор.Например, STDOUT of ls -alh * Команда может быть передана команде less , когда мы выполняем ls -alh * | минус выписка.

    💡 для получения дополнительной информации о команде меньше выполните команду меньше на своем терминале. man — это также команда, которая предоставляет manual команды, распространяемой в UNIX-подобных операционных системах.

     ~ $  ls  -alh * |  минус 
    Заявки:
    всего 16
    drwx ------ @ 5 сотрудников Uday 160B 31 августа 18:15.
    drwxr-xr-x + 31 персонал Uday 992B 9 сентября 17:16 ..
    -rw-r - r - @ 1 персонал Uday 6.0K 31 августа 18:16 .DS_Store
    -rw-r - r-- @ 1 персонал Uday 0B 28 августа, 16:23 .localized
    drwx ------ @ 11 Персонал Uday 352B 4 сентября 23:03 Chrome Apps.localizedCreative Cloud Files:
    , всего 47936
    drwxrwxr-x @ 14 сотрудников Uday 448B сен 8 00:46.
    drwxr-xr-x + 31 персонал Uday 992B 9 сентября 17:16 ..
    -rw-r - r - @ 1 персонал Uday 0B 8 сентября 00:43 Icon
    -rw-r - r-- 1 Uday Staff 707K 11 июл 00:44 пост-1.png
    -rw-r - r-- 1 персонал Uday 1.6M 11 июля 00:44 post-2.ai
    -rw-r - r-- 1 персонал Uday 716K 15 июля 21:07 post-3-01 .png
    -rw-r - r-- 1 сотрудник Uday 1.7M 15 июля 21:07 post-3.ai
    -rw-r - r-- 1 сотрудник Uday 756K 20 июля 23:28 post-4- 01.png
    -rw-r - r-- 1 Uday Staff 1.7M Jul 20 23:28 post-4.ai
    : ▐

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

    По сути, STDIN , STDERR и STDOUT являются потоками, что означает, что они похожи на каналы, по которым текут данные. Они всегда открыты, и любая программа может передавать данные через них. Любой, кому нравится терминальная оболочка, слушающая эти потоки, будет получать данные всякий раз, когда кто-то отправляет через нее.

    | называется оператором pipe , потому что он соединяет два потока и передает данные из одного потока в другой. Например, он может соединить STDOUT программы с STDIN другой программы. So | in ls -alh * | минус в основном подключение STDOUT от ls до STDIN или меньше.

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

    Давайте создадим простой бесконечно работающий цикл while , который печатает случайное число, что означает отправку в поток STDOUT . Но вместо того, чтобы печатать его напрямую на терминал, мы перенаправим или перенаправим вывод на команду минус , которая будет читать его по одной строке за раз.

     (, а  true;  do   sleep  1;  echo  $ RANDOM;  done ) |  меньше  

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

    Если мы хотим записать выходной поток команды в файл, мы можем использовать оператор > AKA оператор перенаправления . Это перезапишет содержимое файла, если файл уже существует, иначе будет создан новый файл.

      echo  "Hello"> random.txt 
    cat random.txt⥤ Hello echo "World"> random.txt
    cat random.txt⥤ World

    Если вы хотите добавить вывод команду в файл, используйте вместо этого >> .

      echo  "Hello" >> random.txt #  также добавляет новую строку  
    cat random.txt⥤ Hello echo "World" >> random.txt # также добавляет новую строку
    cat random.txt⥤
    Hello
    World

    Если вы пишете вывод команды, запускающей бесконечно работающую программу, канал между файлом STDIN и STDOUT программы останется открытым. Любые данные, отправленные в STDIN , будут непрерывно добавляться в файл.

    Мы также можем использовать оператор <, который аналогичен > , но перенаправляет содержимое файла команде. Типичный синтаксис варианта использования будет выглядеть как команда < file.txt , что означает отправку данных файла file.txt в команду .

     ~ $  cat   Hello 
    World

    До сих пор мы имели дело с STDOUT , но если нам нужен поток STDERR , есть &> и & >> синтаксис для него.Это очень хорошо объясняется в ответе .

    4. Переменные среды

    Переменная оболочки - это переменная, определенная внутри сценария Bash. Когда вы исходите из внешнего сценария Bash, переменные, определенные внутри внешнего сценария Bash, будут доступны внутри текущего сценария Bash. Это короткоживущих переменных.

    Переменные среды также являются переменной Bash, но определяются с помощью команды export . Давайте рассмотрим небольшой пример определения такой переменной.

     #  env-test.sh   
    export
    MY_IP = '192.168.1.7'
    echo «Мой IP: $ MY_IP» ----------------- -------------- ~ $ bash env-test.sh
    ⥤ Мой IP: 192.168.1.7

    Когда мы используем команду export , Bash регистрирует эту переменную и сохраняет в пространстве имен текущего сеанса терминала и созданных им подсессий ( подпроцессов, ). Чтобы увидеть список всех доступных переменных среды, мы используем команду printenv .

      ~  $  printenv  ⥤ TERM_PROGRAM = vscode 
    ⥤ TERM = xterm-256color
    ...
    ⥤ HOME = / Users / Uday.Hiwarale

    Но из приведенного выше результата мы не можем увидеть наш MY_IP переменная. Как было сказано ранее, переменные среды доступны только внутри текущего сеанса и созданных им подсессий. Поскольку команда bash запускает сценарий в отдельном сеансе, переменная среды будет создана там и уничтожена в конце.

     #  env-test.sh  
    экспорт MY_IP = '192.168.1.7'
    printenv ------------------------------- ~ $ bash env-test.sh
    MY_IP = 192.168.1.7
    ⥤ TERM_PROGRAM = vscode
    ⥤ TERM = xterm-256color
    ...
    ⥤ HOME = / Users / Uday.Hiwarale

    Как видно из приведенные выше результаты, переменная окружения MY_IP существует внутри сеанса, запущенного командой bash env-test.sh .

    Основное назначение среды - установить глобальные значения для подпроцессов ( подсессий, ), созданных основным сценарием Bash.Давайте посмотрим на пример.

     #  child.sh  
    echo "LOCAL_VAR внутри child.sh: $ LOCAL_VAR"
    echo
    "MY_IP внутри child.sh: $ MY_IP" # main.sh
    LOCAL_VAR = "MAIN4" export MY_IP = '192.168.1.7'
    bash ./child.sh # запускает подсеанс ------------------------ ------- ~ $ bash main.sh
    ⥤ LOCAL_VAR внутри child.sh:
    ⥤ MY_IP внутри child.sh: 192.168.1.7

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

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

     #  main.sh  
    MY_IP = '192.168.1.7' bash ./child.sh-------------------------- ----- ~ $ bash main.sh
    ⥤ MY_IP внутри child.sh: 192.168.1.7

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

    💡 Рекомендуется записывать переменные среды во всех прописных, и переменных оболочки во всех строчных , но мой личный выбор - использовать все прописные буквы для обоих типов. Если вы хотите проверить, существует ли переменная среды в сеансе терминала, вы можете просто повторить ее с помощью команды echo $ SOME_ENV_VAR .

    5. Блок кода (блок операторов)

    Если нам нужно выполнить какой-то код как блок, мы можем поместить наш код в фигурные скобки {} . В отличие от блока () , который выполняет код внутри него во вспомогательной оболочке, блок кода выполняет код в той же оболочке, следовательно, в том же процессе оболочки. Давайте посмотрим на быстрый пример.

     MAIN_VAR = "main" {
    спящий режим 1;
    echo "code-block: $ MAIN_VAR"
    } ⥤ code-block: main

    Если мы хотим запустить какой-то код как блок в одной строке, нам нужно завершить операторы с помощью ; символ ( в отличие от суб-оболочки ).

     MAIN_VAR = "main" { sleep  1;  echo  "кодовый блок: $ MAIN_VAR"; } 
    ( sleep 1; echo "sub-shell: $ MAIN_VAR") ⥤ code-block: main
    ⥤ sub-shell: main

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

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

     VAR_CODE_BLOCK = "INIT" 
    VAR_SUB_SHELL = "INIT" {VAR_CODE_BLOCK = "MODIFIED"; echo "кодовый блок: $ VAR_CODE_BLOCK"; }
    (VAR_SUB_SHELL = "MODIFIED"; echo "sub-shell: $ VAR_SUB_SHELL") echo "основной / кодовый блок: $ VAR_CODE_BLOCK"
    echo "main / sub-shell_SHELL" код_SHELL_SUB: $ VAR_SUB -block: MODIFIED
    ⥤ sub-shell: MODIFIED
    ⥤ main / code-block: MODIFIED
    ⥤ main / sub-shell: INIT

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

    Хороший вариант использования блока кода - pipe (|) или перенаправить (>) вывод некоторых операторов в целом.

     { echo  -n "Привет";  сон  1;  echo  «Мир!»; } >  hello.txt ------------------------------- ~ $  bash  main.sh &&  cat  hello.txt 
    ⥤ Привет, мир!

    6. Специальные символы

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

    Нет никакого вреда, если наша строка содержит простые слова. Проблема возникает, когда слово означает нечто иное, чем Bash, например, * . Такие символы называются специальными символами, и они должны быть либо экранированы с помощью \ , например \ * , либо заключены в кавычки, например "*" .

    https://gist.github.com/thatisuday/10b6c065fd9c98d7fff74127fb356364

    💡 Здесь - это полный список специальных символов в Bash, на которые следует обратить внимание.

    Как запустить сценарий оболочки файла .sh (bash / ksh) в Linux / UNIX

    Я скачал программное обеспечение для своей Linux или Unix-подобной системы из Интернета. Есть файл install.sh. Как запустить файл .sh для установки программного обеспечения в macOS? Как вы запускаете файлы .sh из командной строки?

    Вы можете открыть или запустить файл .sh в терминале Linux или Unix-подобной системы. Файл .sh - это не что иное, как сценарий оболочки для установки данного приложения или выполнения других задач в операционных системах Linux и UNIX.Самый простой способ запустить сценарий оболочки .sh в Linux или UNIX - это ввести следующие команды. Откройте терминал (приглашение вашей оболочки) и введите команды.
    Подробности руководства
    Уровень сложности Easy (rss)
    Права root Нет
    Требования Linux или Unix-подобные системы
    Приблиз. время чтения

    Как мне бежать.sh сценарий оболочки файла в Linux?

    Процедура запуска сценария оболочки файла .sh в Linux выглядит следующим образом:

    1. Откройте приложение Терминал в Linux или Unix
    2. Создайте новый файл сценария с расширением .sh с помощью текстового редактора
    3. Запишите файл сценария, используя nano имя-сценария-here.sh
    4. Установите разрешение на выполнение вашего скрипта с помощью команды chmod:
      chmod + x script-name-here.sh
    5. Для запуска сценария:
      ./script-name-here.sh
      Другой вариант выполнения сценария оболочки:
      sh script-name-here.sh
      OR bash script-name-here.sh

    Давайте подробно рассмотрим примеры скриптов и их использование.

    Синтаксис

    Синтаксис:
    sh file.sh
    ИЛИ
    bash file.sh

    Как запустить файл .sh от имени пользователя root

    Некоторое время вам понадобится root-доступ для установки приложения; без root у вас не будет необходимых разрешений для установки приложения или внесения изменений на системном уровне.Доступ с правами root по умолчанию отключен во многих Linux и UNIX подобных системах. Просто используйте команду sudo или su следующим образом:
    sudo bash filename.sh
    Введите свой пароль. Другой вариант - использовать команду su, чтобы стать суперпользователем:
    su -
    Введите пароль пользователя root и, наконец, запустите свой сценарий:
    bash filename.sh

    Как использовать команду chmod для запуска сценария оболочки .sh в Linux

    Другой рекомендуемый вариант - установить разрешение для исполняемого файла с помощью команды chmod следующим образом:
    chmod + x file.sh
    Теперь вы можете запустить свой файл .sh следующим образом:
    ./file.sh
    /path/to/file.sh

    Как запустить файл .sh с именем install.sh?

    Просто выполните две следующие команды:
    chmod + x install.sh
    ./install.sh

    Точка (.) Относится к текущему рабочему каталогу. Install.sh находится в текущем каталоге, поэтому вы запускаете его, как указано выше, или также следующим образом:
    bash install.sh
    ИЛИ
    sh install.sh

    GUI метод для запуска.sh файл

    1. Выберите файл с помощью мыши.
    2. Щелкните файл правой кнопкой мыши.
    3. Выбрать Свойства :
    4. Щелкните вкладку Разрешения .
    5. Выберите Разрешить выполнение файла как программы:
    6. Теперь щелкните имя файла, и вам будет предложено. Выберите «Выполнить в терминале», и он будет выполнен в терминале.

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

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