Сайт о телевидении

Сайт о телевидении

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

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

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

Основная задача оболочки - выполнять команды, но кроме утилит, расположенных в файловой системе, Bash имеет свой набор команд, многими из которых вы пользуетесь каждый день сами этого не понимая. Эти команды Bash находятся не на диске, а встроены в саму оболочку. В этой статье мы рассмотрим основные команды bash в linux, которые могут быть полезны в некоторых ситуациях.

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

1. source

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

source /etc/profile

2. alias

Команда alias позволяет создавать псевдонимы для других команд. Например, вы можете настроить так, чтобы когда вы вводите update, выполнялась команда sudo apt update && sudo apt upgrade. Если вызвать команду без параметров, то она выведет список уже заданных псевдонимов. Смотрите подробнее о том как создавать в отдельной статье.

3. bind

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

bind ""\e, ~, {, }) для поиска файлов по шаблонам имен.

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

    2.1. Псевдонимы

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

    Например:

    $ export HELLO="Hello from environment! " # пробел нужно экранировать кавычками

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

    Окружение (environment)- это набор переменных, значения которых может менять поведение оболочки.

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

    Таким образом, командный интерпретатор определяет переменные окружения, которые используются в текущем сеансе. Каждая новая введенная команда фактически запускается как дочерний процесс родительского процесса, в качестве которого, в данном случае выступает командный интерпретатор bash. Переменные окружения отличаются от обычных переменных тем, что они доступны как для родительских, так и для дочерних процессов. Автоматическое определение переменных окружение происходит после аутентификации пользователя в системе. Программа login, в случае успешного завершения процесса аутентификации, на основе файла /etc/passwd определяет какой командный интерпретатор будет использоваться в сеансе данного пользователя. После определения командного интерпретатора происходит настройка сеанса согласно конфигурационным файлам, представленным ниже.

    Конфигурационный файл Описание
    /etc/profile

    Определяет переменные окружения для всех пользователей системы. Данный файл выполняется при первом входе в систему и содержит основные переменные окружения, такие как, переменная поиска расположения команд PATH, переменная имени хоста HOSTNAME, переменная, определяющая размер истории команд HISTSIZE. Кроме того данный файл генерирует дополнительные переменные окружения из конфигурационных файлов, находящихся в каталоге /etc/profile.d .

    /etc/bashrc

    Выполняется для всех пользователей, при каждом запуске командного интерпретатора bash. В данном файле определяется значение переменной PS1, а также дополнительные псевдопимы команд (alias). Псевдонимом называется сокращенное произвольно заданное название команды или последовательности команд, позволяющее выполнять сложные последовательности команд, не вводя их с клавиатуры, а вызывая их через обращение к соответствующему псевдониму. Переменные, определенные в данном файле могут«быть переназначены аналогичным пользовательским файлом -/.bashrc, который имеет более высокий приоритет.

    -/.bashprofile

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

    ~/.bashrc

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

    ~/.bash_logout

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

    /etc/inputrc

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

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

    export AB=/usr/dog/contagious/ringbearer/grind

    В данном примере временной переменной окружения AB присваивается путь к каталогу, расположенному достаточно "глубоко" в иерархии каталогов файловой системы. Команда export указывает на необходимость экспорта значения переменной АВ в оболочку, для того чтобы сделать его доступным для других оболочек, которые могут быть открыты в пределах текущего сеанса работы с системой. Теперь к указанному выше каталогу можно добраться посредством выполнения команды cd $AB

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

    Для изменения конфигурационных файлов /etc/profile и /etc/bashrc необходимо быть суперпользователем root.

    Обычные пользователи могут изменять конфигурационные файлы ~/.bash_profile, ~/.bashrc и ~/.bash_Iogout, находящихся в их домашних каталогах. В эти конфигурационные файлы можно включить установку своих переменных в окружение с помощью команды export и использовать их в любом сеансе.

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

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

    Чтобы данные изменения применились в окружении текущей оболочки необходимо выполнить команду source .bashrc

    Наиболее распространенные переменные окружения командной оболочки:

    • BASH - Содержит полный путь к команде bash (как правило, значение этой переменной равно /bin/bash).
    • BASH_VERSION - Номер версии bash.
    • DIRSTACK- Массив, содержащий текущее значение стека каталога.
    • EDITOR - текстовый редактор по умолчанию.
    • EUID - Числовой эффективный идентификатор текущего пользователя.
    • FUNCNAME - имя текущей функции в скрипте.
    • GROUPS - Массив, содержащий список групп, к которым принадлежит текущий пользователь.
    • HISTFILE - Местоположение файла истории команд. Как правило, история команд хранится в файле ~/.bash_history.
    • HISTFILESIZE - Число командных строк, которые могут храниться в файле истории. После достижения этого числа новые командные строки заносятся в историю за счет удаления наиболее ранних командных строк. По умолчанию размер списка недавно использовавшихся команд равен 1000 строк.
    • HOME - Домашний каталог пользователя.
    • HOSTNAME - Имя данного компьютера (узла).
    • HOSTTYPE - Тип компьютера.
    • LANG - Текущий используемый по умолчанию язык.
    • LC_CTYPE - внутренняя переменная, котороя определяет кодировку символов.
    • MAIL - Местоположения файла ящика электронной почты пользователя. Как правило, это файл, расположенный в каталоге /var/spool/mail, имя которого совпадает с регистрационным именем пользователя.
    • MAILCHECK - Интервал в минутах между проверками почты.
    • OLDPWD - Каталог, который являлся текущим до момента последнего изменения каталога.
    • OSTYPE - Текущая операционная система.
    • PATH - Разделенный символами двоеточия список каталогов, в которых производится поиск исполняемых файлов. Крайне важен порядок ледования имен каталогов. При выполнении команд перечисленные в этой переменной каталоги проверяются последовательно слева направо. Т.о., при выполнении команды foo, расположенной в каталогах /bin и /usr/bin, будет выполнена команда, расположенная в каталоге /bin. Для того чтобы в аналогичной ситуации была выполнена команда foo, расположенная в каталоге /usr/bin, следует либо указать полный путь к этой команде, либо изменить порядок следования имен каталогов в переменной окружения PATH. Текущий каталог поиска должен быть задан явно ("."), оболочка не производит поиск в текущем каталоге по умолчанию. Поиск запускаемых программ в текущем каталоге таит потенциальную опасность вследствие возможности непреднамеренного выполнения опасной программы, поэтому переменная PATH обычно инициализируется без "." Для того, чтобы добавить к переменной PATH путь к своим собственным командам или сценариям оболочки, их следует разместить в подкаталоге /bin домашнего каталога, который будет автоматически занесен в переменную PATH. Не все исполняемые команды расположены в каталогах, перечисленных в переменной окружения PATH. Некоторые команды встроены непосредственно в оболочку. Другие команды могут быть переопределены с помощью псевдонимов, позволяющих заменить команды с параметрами практически любой сложности (с точки зрения синтаксиса) одним простым именем. Помимо этого, существует возможность создания функций, хранящих в себе целую последовательность команд.
    • PPID - Идентификационный номер процесса, соответствующего команде, в результате выполнения которой была запущена текущая оболочка(например, процесс, породивший оболочку).
    • PS1, PS2, PS3, PS4 - Переменные, определяющие вид приглашения оболочки.

      Переменные PS1 и PS2 устанавливают первичное и вторичное приглашение командного интерпретатора.

      Вторичное приглашение (PS2) появляется, если вы нажали клавишу Enter, синтаксически не закончив ввод команды.

      Данная переменная содержит второстепенное приглашение, которое возникает при многострочном редактировании текста или незавершенном вводе команды. По умолчанию оно обозначается как >.

      PS3. Данная переменная содержит приглашение, присутствующее в операторе select, используемой для организации интерактивных консольных меню. По умолчанию приглашению PS3 в операторе select соответствует значение #?.

      PS4. Данная переменная используется в основном при отладке сценариев командного интерпретатора и по умолчанию содержит строковое значение «++».

      Например, запуск команды получения информации DNS:

      # nslookup >

    • PWD - Текущий рабочий каталог пользователя. Это значение изменяется каждый раз при переходе в другой каталог с помощью команды cd.
    • SECONDS - время работы скрипта(в сек.).
    • SHELL - Текущий интерпретатор команд.
    • SHELLOPTS - Список включенных параметров интерпретатора.
    • SHLVL - Число запусков новых копий интерпретатора команд.
    • UID - Числовой идентификатор текущего пользователя.
    • USER - Имя текущего пользователя.
    • $# - Общее количество параметров переданных скрипту.
    • $* - Все аргументы переданыне скрипту(выводятся в строку).
    • $@ - Тоже самое, что и предыдущий, но параметры выводятся в столбик.
    • $! - PID последнего запущенного в фоне процесса.
    • $$ - PID самого скрипта.

    Чтобы просмотреть значения всех переменных текущего сеанса, как определенных вами, так и переменных окружения, введите команду set без параметров или env printenv .

    Удалить переменную можно командой unset .

    2.4. Подстановки и организация взаимодействия между командами

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

    Подстановка результата вычисления арифметического выражения

    Существуют две синтаксические формы подстановки результата вычисления арифметического выражения: $[выражение] и $((выражение)). Например,

    echo "I am $ years old."

    Подстановка команд

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

    Раскрытие символа тильды

    Символ тильды (~) позволяет быстро вводить названия каталогов.

    ~ Имя домашнего каталога пользователя ~/подкаталог Имя одного из подкаталогов в домашнем каталоге пользователя ~+ Имя текущего каталога ~- Имя предыдущего каталога

    Раскрытие фигурных скобок

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

    mkdir expenses/{Jan,Feb,Mar} эквивалентна mkdir expenses/Jan mkdir expenses/Feb mkdir expenses/Mar

    Каналы

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

    cat /etc/passwd | sort | head -3

    Последовательности и группы команд

    Использование последовательностей и групп команд позволяют ввести несколько команд на одной строке.

    команда1;команда2 Выполнить сначала команду 1, затем команду 2 (команда1;команда2) Запустить отдельную копию интерпретатора, в которой выполнить последовательно команды 1 и 2 { команда1;команда2 } Выполнить команды 1 и 2 последовательно в текущем интерпретаторе команда1 && команда2 Выполнить команду 2 только в случае успешного выполнения команды 1 команда1 || команда2 Выполнить команду 2 только в случае неуспешного выполнения команды 1

    Результатом выполнения любой команды (т.е. результатом завершения соответствующего процесса) является код завершения. Успешное завершение имеет код 0, неуспешное 1. Значение кода завершения присваивается предопределенной переменной? (знак вопроса). Например, echo $?

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

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

    После ввода командной строки оболочка помещает ее в историю команд. Список ранее использовавшихся команд хранится в файле, который позволяет в любое время вызвать из него любую нужную командную строку для повторного выполнения. После повторного вызова командной строки она может быть отредактирована. История команд хранится в файле.bash_history, который находится в домашнем каталоге пользователя. По умолчанию командная оболочка способна "запомнить" до 1000 командных строк.

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

    Синтаксис раскрытия истории: !n Выполнить команду с заданным номером!! Выполнить предыдущую команду!строка Выполнить самую последнюю из команд, начинающихся с заданной строки!?строка? Выполнить самую последнюю из команд, содержащих заданную строку

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

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

    Список встроенных команд оболочки bash можно получить по команде help или найти на man-странице в секции SHELL BUILTIN COMMANDS.

    Вот несколько полезных встроенных команд:

    • echo [аргументы] - Вывод аргументов на экран.
    • enable - Заставляет оболочку вместо встроенной команды выполнить исполняемый файл с таким же именем. Полезно, если у вас есть собственный сценарий по имени, например, echo.
    • eval [аргументы] - Конструирование команды на лету, из указанных аргументов, и отправка ее на выполнение.
    • let - Вычисление выражений.
    • - Прочитать и выполнить команды, содержащиеся в файле. Применяется для определения пользовательских переменных. и функций.
    • basename - Выделение локального имени.
    • expr - Вычисление выражения.
    • read - Ввод значения переменной.
    • shift - Сдвиг списка параметров.
    • test - Проверка условия.
    Другие встроенные команды служат инструкциями командного языка bash.

    Прочитав эту статью, вы узнаете что такое bash (стандартный командный интерпретатор линукс), научитесь обращаться со стандартными командами: ls , cp , mv … поймете назначение инодов, жестких и символических ссылок и многое другое.

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

    Введение в bash

    Shell

    Если вы используете линукс, то знаете что после логина вас приветствует приглашение командного интерпретатора. Например такое:

    \$

    Если после логина загружается графическая оболочка, то чтобы добраться до командного интерпретатора нужно запустить эмулятор терминала (gnome-terminal, xfce4-terminal, konsole, xterm, rxvt…) или переключиться на один из виртуальных терминалов нажав Ctrl Alt F1 или Ctrl Alt F2 и т.д.

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

    У вас запущен bash?

    Проверить запущен ли bash можно следующей командой:

    \$ echo \$SHELL /bin/bash

    Если в результате выполнения этой команды вы получили ошибку или её вывод отличается от того что в примере, то возможно в вашей системе в качестве командной оболочки используется не bash. Несмотря на это, большая часть материала будет актуальна, но все же рекомендуем вам переключиться на bash. Сделать это можно (если bash установлен в системе) командой:

    \$ bash

    Что такое bash

    Bash (акроним от «B ourne-a gain SH ell») это стандартный интерпретатор команд на большинстве линукс систем. В его обязанности входит обработка и исполнение команд с помощью которых пользователь управляет компьютером. После того как вы завершили работу, можно завершить процесс командного интерпретатора. После нажатия клавиш Ctrl D , команд exit или logout процесс командного интерпретатора будет завершен и на экране снова появится приглашение ввести имя пользователя и пароль.

    Использование «cd»

    Давайте начнем использовать bash для навигации по файловой системе. Для начала напечатайте следующую команду:

    $ cd /

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

    Пути

    Чтобы узнать в каком месте файловой системы в данный момент вы находитесь (текущую рабочую директорию) наберите:

    \$ pwd /

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

    Абсолютные пути

    Вот несколько примеров абсолютных путей

    /dev /usr /usr/bin /usr/local/bin

    Как вы уже могли заметить, все эти пути объединяет то, что они начинаются с / . Указывая путь /usr/local/bin в качестве аргумента команде cd мы говорим ей перейти в корневую директорию / , затем в директорию usr, потом в local и bin. Абсолютные пути всегда начинаются с /

    Относительные пути

    Второй вид путей называется относительными. Bash , команда cd и другие команды отсчитывают эти пути относительно текущей директории. Относительные пути никогда не начинаются с / . Например, если мы находимся в /usr

    \$ cd /usr

    Затем мы можем перейти в /usr/local/bin используя относительный путь

    \$ cd local/bin \$ pwd /usr/local/bin

    Использование «..»

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

    \$ pwd /usr/local/bin \$ cd .. \$ pwd /usr/local

    Как вы видите, команда cd .. ‘поднимает нас на уровень выше’.

    Можно добавить .. к относительному пути. Это позволит переместиться в директорию, которая находится на одном уровне с той в которой мы находимся. Пример:

    \$ pwd /usr/local \$ cd ../share \$ pwd /usr/share

    Примеры с использованием относительных путей

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

    \$ cd /bin \$ cd ../usr/share/zoneinfo \$ cd /usr/X11R6/bin \$ cd ../lib/X11 \$ cd /usr/bin \$ cd ../bin/../bin

    Рабочая директория «.»

    Перед тем как закончить разговор о команде cd , следует упомянуть еще несколько вещей. Во-первых, существует ещё одна специальная директория «.» , которая указывает на текущую директорию. Эта директория используется для запуска исполняемых файлов, находящихся в текущей директории.

    \$ ./myprog

    В последнем примере myprog это исполняемый файл находящийся в текущей директории, который будет запущен на исполнение.

    cd и домашняя директория пользователя

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

    \$ cd

    Без аргумента cd переместит вас в домашнюю директорию. Для суперпользователя домашней обычно является директория /root, а для обычных пользователей - /home/username/. Но что если мы хотим указать конкретный файл, находящийся в домашней директории. Например, как аргумент к программе ‘myprog’ ? Можно написать:

    \$ ./myprog /home/user/myfile.txt

    Однако, использовать абсолютные пути к файлам не всегда удобно. Эту же операцию можно сделать при помощи ~ –тильды:

    \$ ./myprog ~/myfile.txt

    ~ - специальное имя, указывающее в bash на домашнюю директорию пользователя.

    Домашние директории других пользователей

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

    \$ ./myprog ~fred/fredsfile.txt

    Команды линукс

    Введение в ls

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

    \$ cd /usr \$ ls X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info local portage.old src

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

    \$ ls -a . bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info local portage.old src X11R6 doc i686-pc-linux-gnu lib man sbin ssl

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

    После самой команды ls в качестве ее аргумента можно указать один или более файлов или директорий. Если указать имя файла, то команда ls выведет информацию только об этом файле. А если указать название директории, ls покажет все ее содержимое. Опция ‘-l’ команды ls бывает очень полезной если вы хотите кроме имен файлов узнать более подробную информацию о них (права на файл, имя владельца, время последнего изменения файла и его размер).

    В следующем примере показано применение опции ‘-l’ для вывода информации о файлах хранящихся в директории /usr

    \$ ls -l /usr drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc drwxr-xr-x 62 root root 1856 Dec 27 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 Dec 12 23:10 i686-linux drwxr-xr-x 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Dec 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info drwxr-xr-x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrwxrwxrwx 1 root root 9 Dec 22 20:57 man -> share/man lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old drwxr-xr-x 3 root root 3096 Dec 22 20:57 sbin drwxr-xr-x 46 root root 1144 Dec 24 15:32 share drwxr-xr-x 8 root root 328 Dec 26 00:07 src drwxr-xr-x 6 root root 176 Nov 24 14:25 ssl lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/tmp

    В первой колонке показана информация о правах доступа к каждому файлу в списке. (Немного позже я объясню какая буква что обозначает) Следующая колонка показывает количество ссылок на каждый элемент списка. Третья и четвертая колонки - владелец и группа файла соответственно. Пятая колонка - размер. Шестая - время последнего изменения файла (‘last modified time’ или mtime). Последняя колонка - имя файла или директории (Если это ссылка, то после знака ‘–> ‘ стоит имя объекта на который она ссылается).

    Как посмотреть только директории

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

    \$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share drwxr-xr-x 4 root root 96 Dec 18 18:17 ../share drwxr-xr-x 17 root root 576 Dec 24 09:03 /usr drwxr-xr-x 2 root root 3192 Dec 26 12:52 /usr/X11R6/bin drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin

    Рекурсивный список и информация о инодах

    Действие опции ‘-R’ противоположно действию ‘-d’ . Она позволяет выводить информацию о файлах находящихся в директории рекурсивно. Сначала показывается содержимое директории верхнего уровня, потом по очереди содержимое всех поддиректорий и так далее. Вывод этой команды может быть достаточно объемным, поэтому мы не приводим ее пример, но вы можете попробовать сделать это самостоятельно, набрав в командной строке ‘ls -R ‘ или ‘ls -Rl ‘.

    И, наконец, опция ‘-i’ используется для вывода инодов каждого объекта файловой системы.

    \$ ls -i /usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 include 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp

    Что такое иноды?

    Каждый объект файловой системы (файл, директория…) имеет свой уникальный номер, называемый инодом (inode number). Эта информация может показаться незначительной, но понимание функции инодов поможет вам разобраться во многих операциях над файловой системой. Например, посмотрим на «.» и «..» как на ссылки, присутствующие в каждой директории. Чтобы понять что из себя представляет директория «..» , узнаем инод директории /use/local

    \$ ls -id /usr/local 5120 /usr/local

    Как можем видеть, инод директории /usr/local - 5120. Теперь посмотрим какой инод у директории /usr/local/bin/..:

    \$ ls -id /usr/local/bin/.. 5120 /usr/local/bin/..

    Получается, что иноды директорий /usr/local и /usr/local/bin/.. совпадают! Это значит, что на инод 5120 ссылаются два имени: /usr/local и /usr/local/bin/.. То есть это два разных имени одной директории. Каждый инод указывает на определенное место на диске.

    С каждым инодом может быть связано несколько имен объектов файловой системы. Количество ‘синонимов’ файла (объектов файловой системы, ссылающихся на один инод) показывает число во втором столбце вывода команды ‘ls -l ‘.

    \$ ls -dl /usr/local drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local

    На этом примере видно (второй столбец), что на директорию /usr/local ссылаются 8 разных объектов файловой системы. Вот их имена:

    /usr/local /usr/local/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/src/..

    mkdir

    Давайте рассмотрим команду mkdir . Она служит для создания новых директорий. В следующем примере демонстрируется создание трех новых директорий (tic, tac, toe) в директории /tmp

    \$ cd /tmp $ mkdir tic tac toe

    По умолчанию команда mkdir не может создать вложенной структуры директорий. Поэтому, если вам нужно создать несколько вложенных одна в другую директорий (won/der/ful ), то вам придется три раза поочередно вызывать эту команду:

    \$ mkdir won/der/ful mkdir: cannot create directory "won/der/ful": No such file or directory \$ mkdir won \$ mkdir won/der \$ mkdir won/der/ful

    Упростить эту операцию можно добавив опцию ‘-p’ к команде mkdir. Эта опция позволяет создавать вложенную структуру директорий:

    \$ mkdir -p easy/as/pie

    Чтобы узнать о возможностях этой утилиты подробнее, прочитайте справку, которая вызывается командой man mkdir . Справки есть практически ко всем командам из этого руководства (например man ls ), кроме cd , т.к. она встроена в bash (для таких команд справка вызывается так: help cd )

    touch

    Перейдем к изучению команд cp и mv , служащих для копирования, переименования и перемещения файлов и директорий. Но перед этим создадим пустой файл в директории /tmp при помощи команды touch :

    \$ cd /tmp \$ touch copyme

    Команда touch обновляет время последнего доступа к файлу (шестая колонка вывода команды ls -l ) если он уже существует или создает новый пустой файл, если его ещё нету. После этой операции у нас должен появиться пустой файл /tmp/copyme .

    echo

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

    \$ echo "firstfile" firstfile

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

    \$ echo "firstfile" > copyme

    Знак > (больше) указывает командной оболочке что нужно перенаправить вывод команды стоящей слева в файл, имя которого находится справа. Если файла с таким именем не существует, он будет создан автоматически. А если такой файл уже есть, то он будет перезаписан (все его содержимое будет стерто перед записью нашей строки). Команда ‘ls -l’ покажет что размер нашего файла теперь равен 10 байтам - девять байт занимает слово ‘firstfile’ и один байт символ перевода строки.

    \$ ls -l copyme -rw-r--r-- 1 root root 10 Dec 28 14:13 copyme

    cat и cp

    Для вывода содержимого файла на терминал используется команда cat :

    \$ cat copyme firstfile

    Теперь мы можем приступить к разбору базовой функциональности команды cp . Эта команда принимает два аргумента. Первый - имя уже существующего файла (‘copyme’), второй - название новой копии, которую мы хотим сделать (‘copiedme’).

    \$ cp copyme copiedme

    Можем убедиться, что новая копия файла имеет другой номер инода (это значит что мы получили действительно новый отдельный файл, а не просто ссылку на старый)

    \$ ls -i copyme copiedme 648284 copiedme 650704 copyme

    mv

    Теперь применим команду mv чтобы переименовать файл («copiedme» –> «movedme»). Номер инода после этой операции не меняется, а изменяется только название файла.

    \$ mv copiedme movedme \$ ls -i movedme 648284 movedme

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

    Команда mv позволяет не только переименовывать файлы, но и перемещать их. Например, чтобы переместить файл /var/tmp/myfile.txt в директорию /home/user нужно дать команду:

    \$ mv /var/tmp/myfile.txt /home/user

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

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

    Чтобы переместить одновременно несколько файлов в одну директорию нужно написать:

    \$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt /home/user \$ mv -t /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

    Если добавить опцию ‘-v’ , на экран будет выведен отчет о проделанной операции:

    \$ mv -vt /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt "/var/tmp/myfile1.txt" -> "/home/user/myfile1.txt" "/var/tmp/myfile2.txt" -> "/home/user/myfile2.txt"