Командный файл в среде linux имееет расширение

Обновлено: 07.07.2024

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

Пространство нашего жесткого диска занято файлами разных типов. Например, взять даже наш корневой раздел (/), при создании файла, файловая система записывает его в определенном формате на нужное физическое место жесткого диска. Всегда, для работы с файлами используется файловая система, но не всегда она записывает файлы на диск, файловая система может работать на лету, генерируя файлы, например, как procfs, с помощью которой может быть выполнена настройка ядра linux или записывать файлы в оперативную память, как tmpfs расположенная в папке /tmp. Но все это не имеет значения, ведь в любом случае мы имеем дело именно с файлами.

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

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

Типы файлов в Linux

Файлы в операционной системе Linux можно поделить на три основных типа:

  • Обычные файлы, для хранения информации
  • Специальные файлы - для устройств и туннелей
  • Директории

Дальше рассмотрим более подробно эти типы файлов linux.

Обычные файлы

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

  • Текстовые файлы
  • Исполняемые файлы
  • Файлы изображений
  • Файлы архивов
  • Файлы библиотек программ
  • И другие подобные типы

Утилита ls может определять тип файла в режиме списка, обычные файлы обозначаются черточкой, например:

files1

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

Посмотреть форматы файлов linux можно с помощью утилиты file. Например:

files2

Система сообщила что это исполняемый файл, а теперь посмотрим обычный, текстовый:

files3

Утилита умеет распознавать все известные форматы файлов. Чтобы узнать вывести все доступные форматы файлов linux наберите:

Специальные файлы

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

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

Утилита ls обозначает блочные файлы буквой b, например, выберем все блочные файлы из каталога /dev:

ls -l /dev/ | grep "^b"

files

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

files4

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

Вы также можете отфильтровать их с помощью ls. Символьные файлы обозначаются буквой c (character):

ls -l /dev/ | grep "^c"

files5

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

Но вернемся к символическим ссылкам. Утилита ls обозначает их буквой l (link):

ls -l /dev/ | grep "^l"

files6

Создавать символические ссылки можно с помощью утилиты ln. Например:

ln -s file1.txt file2.txt

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

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

Обозначаются такие типы файлов linux буквой p (pipe):

ls -l /dev/ | grep "^p"

files7

Чтобы создать именованный тоннель вы можете использовать утилиту mkfifo:

echo "test test test" > pipe1

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

while read line ;do echo "Data: '$line' "; done<pipe1

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

Файлы сокетов обозначаются буквой s:

ls -l /dev/ | grep "^s"

files11

Создать сокет можно с помощью функции socket() на языке программирования Си, чтение и запись выполняется системными вызовами read() и write(). Но нам сейчас не нужно писать реальную программу, будет достаточно немного поиграться. Поэтому воспользуемся утилитой nc. Создаем Unix сокет:

nc -lU socket.sock

files9

Подключаемся к нему из другой консоли:

nc -U socket.sock

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

Каталоги

Это специальные файлы, которые позволяют объединять другие и каталоги в группы для более простой навигации и поиска. Естественно, они могут содержать как обычные, так и специальные файлы, одним словом любые типы файлов ос linux. В системе Linux, файлы организуются в папки начиная от корня (/)

Обозначаются каталоги буквой d (directory):

files10

Создать каталог в linux можно с помощью команды mkdir:

Заключение

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

В Linux, так же как и в операционных системах семейства Microsoft Windows можно создавать командный файл . которые содержат в себе набор команд интерпретатора shell. Такие файлы имеют свой синтаксис, который позволяет оперировать такими структурами как циклы и условия. Далее основы shell программирования linux на примере командной строки ubuntu 9.04 и интерпретатора bash.

Основы

Запишем в файл sample последовательность команд

$ cat sample
pwd
ls
echo The END

А теперь выполним эти команды

$ sh sample
/home/sgww
cpp file.txt mydaemon net_sh perl php sample
The END

Таков принцип .

Командный файл легко сделать исполняемым

$ chmod +x sample
$ /home/sgww/sample
/home/sgww
cpp file.txt mydaemon net_sh perl php sample
The END

Параметры

$1, $2 . $9 - позволяют задавать аргументы командной строки для выполняемого файла

$ cat sample
echo the first parameter: $1
echo the second parametr: $2
echo the third parameter: $3
ls $1 $2 $3

$ /home/sgww/sample -l -s -r
the first parameter: -l
the second parametr: -s
the third parameter: -rtotal 28
4 -rwxr-xr-x 1 sgww sgww 100 Mar 2 11:19 sample
4 drwxr-xr-x 2 sgww sgww 4096 Dec 15 16:52 php
4 drwxr-xr-x 2 sgww sgww 4096 Feb 1 15:39 perl
4 -rw-r--r-- 1 sgww sgww 79 Mar 1 16:16 net_sh
4 drwxr-xr-x 2 sgww sgww 4096 Feb 1 17:15 mydaemon
4 -rw-r--r-- 1 sgww sgww 56 Mar 1 17:18 file.txt
drwxr-xr-x 2 sgww sgww 4096 Feb 1 17:15 cpp

Переменные

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

_var=1
_word =slovo
value="t ak aia dli nna iain epo niat naia str oka"

Тип данных переменных shell это всегда строка символов!

$ cat sample
_string="Hello from Perm"
echo $_string
$ /home/sgww/sample
Hello from Perm

результат выполения команды в переменную (команда обрамляется обратными апострофами)

$cat sample
_date=`date`
echo $_date
$/home/sgww/sample
Tue Mar 2 11:41:30 YEKT 201

ввод значения переменной в консоли

$ cat sample
echo Enter data:
read data1
read data2
echo Your data: $data1 and $data2
$ /home/sgww/sample
Enter data:
Linux
Windows
Your data: Linux and Windows

Системные переменные

$ cat sample
echo $PATH
echo $HOME
echo $MAIL
echo $SHELL
$ /home/sgww/sample
/usr/local/bin:/usr/bin:/bin:/usr/bin/X1 1:/usr/games
/home/sgww
/var/mail/sgww
/bin/bash

PATH - пути поиска исполняемых файло (так как каталога /home/sgww/ там нет, постояно приходилось писать полный путь /home/sgww/sample для выполнения команды)
HOME - домашний каталог
MAIL - файл электронной почты
SHELL - оболочка в которой работаем

Добавим к переменной PATH каталог HOME что бы не приходилось постоянно писать полный путь

$ cat sample
PATH=$PATH:$HOME

Эти строки следует добавить в

/.bash_profile
теперь нет необходимости писать полный путь до команды

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

* - любая последовательность, любых символов
? - один любой символ
[. ] - любой из символов диапазона

$echo *
cpp file.txt mydaemon net_sh perl php sample
$ echo "*"
*

$ cat sample
text="This is a text"
echo \$text
$ sample
$text

$ cat sample
text=`pwd`
echo $text
$ sample
/home/sgww

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

Для выполнения арифметических операций в командном файле понадобиться команда expr

$ expr 7 + 96
103
$ expr 87 - 555
-468
$ expr 18 / 2
9
$ expr 19 / 2
9
$ expr 19 % 2
1
$ expr 6 \* 32
192
$ expr 6 '*' 32
192
$ expr 6 * 32
expr: syntax error

Если при умножении не поставить \ или '' то * будет восприниматься как любой символ

Стоит отметить, что \ - это не деление, а целая часть от деления, операция % дает остаток от деления

Переменные окружения, команда export и unset

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

Их полный списко можно посмотреть командой export

$ export
declare -x HISTCONTROL="ignoreboth"
declare -x HOME="/home/sgww"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="sgww"
.

Задать свою переменную

$ name=Pavel && export name
$ echo $name
Pavel

$ unset name
$ echo name

Условие IF

Для составления условных выражений оператора if очень полезна программа test.

$ cat sample
if test -r sample
then
echo True
else
echo False
fi
$ sample
True

В этом примере test -r sample - это условие
echo True выполняется если условие истино
echo False если ложно

Программа test предназначена для проверки типов файлов и сравнения значений

Остальные параметры можно посмотреть в man test

Цикл FOR

$ cat sample
for x in 1 two 3
do
echo $x
done
$ sample
1
two
3

В этом цикле код между do и done выполниться 3 раза, при этом первый раз
x=1, второй раз x=two и последний x=3

Другой интересный пример

$ cat sample
for x in *
do
echo $x
done
$ sample
cpp
demo
file.txt
mydaemon
net_sh
perl
php
sample

* в списке переменных цикла, заставляет for использовать в качестве значения $x элементы текущего каталога

Циклы WHILE и UNTIL

$ cat sample
while test -r file
do
sleep 10
echo file exists
done
echo file does not exist

$ touch file
$ sample
file exists
file exists
Ctr+Z
[1]+ Stopped sample
$ rm file
$ fg
sample
file exists
file does not exist

$ cat sample
until test -r file
do
sleep 5
echo file does not exist
done
echo file exists
$ sample
file does not exist
file does not exist
Ctr+Z
[1]+ Stopped sample
$ touch file
$ fg
sample
file does not exist
file exists
$

print
Автоматизация действий в ОС

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

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

```text
program <имя_входного_файла >имя_выходного_файла
program >имя_выходного_файла 2>имя_вых_файла_для_ошибок
program >>имя_выходного_файла_с_добавлением
program1 | program2 | program3
```

В последнем варианте выход одной программы становится входом для другой, например, для постраничного вывода: ``help|more``.
В Linux и cmd передается текст, в PowerShell могут передаваться коллекции объектов любых типов.

Командные интерпретаторы управляют элементами ОС:

* текущий путь;
* переменные окружения;
* файловая система;
* запущенные программы.


Действия с текущим путем:

||.draw||Действие|bash|cmd|PowerShell
---|----|---|---
Текущий путь|``pwd``|``cd``|``Get-Location``
Изменение пути|``cd`` путь|``cd /d`` путь|``Set-Location`` путь
Переход с сохранением|``pushd`` путь|``pushd`` путь|``Push-Location`` путь
Восстановление пути|``popd``|``popd``|``Pop-Location``

В PowerShell поддерживаются сокращенные имена команд ``Get-Location`` -- ``pwd``, ``Set-Location`` -- ``cd``.
Узнать все сокращения можно с помощью команды ``Get-Alias``

В Linux регистр команд является важным.

Действия с переменными окружения:

||.draw||Действие|bash|cmd|PowerShell
---|----|---|---
Подстановка|$VAR|%VAR% !VAR!|$env:VAR
Узнать значения|env|set|Get-ChildItem env:
Установка|export VAR=знч|set VAR=знч|$env:VAR=знч

В bash различаются переменные окружения и переменные в командном файле.
Для арифметических вычислений в cmd используется ``SET /A``, в bash -- ``let`` и ``((``выражение``))``.
Вариант !VAR! используется для значений, устанавливаемых внутри операторов (IF, FOR), работает только при включении\
``SETLOCAL ENABLEDELAYEDEXPANSION``.

Действия с файловой системой:

||.draw||Действие|bash|cmd|PowerShell
---|----|---|---
Список файлов|ls|dir|Get-ChildItem
Копировать|cp|copy|Copy-Item
Переименовать|mv|ren, move|Rename-Item, Move-Item
Удалить|rm|del|Remove-Item
Создать папку|mkdir|mkdir|New-Item -itemtype directory
Удалить папку|rmdir|rmdir|Remove-Item

||.draw||Действие|bash|cmd|PowerShell
---|----|---|---
Запуск|имя|имя|имя, & "имя"
Результат|$?|%ERRORLEVEL%|$LastExitCode
В строку|`` ` ``имя`` ` ``, $(имя)|через set|$(имя)
В фоне|имя &|start /b имя|Start-Process -NoNewWindow имя
Переключение|bg, fg|-|-
Список|ps|tasklist|Get-Process
Останов|kill|taskkill|Stop-Process


Для запуска программ из текущей папки в bash и PowerShell указать ./имя или .\\имя

Работа со строками:

Параметры командной строки доступны по $1, $2 в bash, $args[0], $args[1] в PS, %1, %2 в cmd. Для подстановки сложных выражений в PS в командах и строках в``""`` использовать $(выражение), например, ``$("ab:"+$a+$b)`` или ``"ab:$($a+$b)"``.

Пример - время выполнения программы program в мс с помощью cmd

```text
SET /A st=1%time:

9,2% - 36610100
program
SET /A et=1%time:

9,2% - 36610100
SET /A dt=(%et%-%st%)*10
ECHO %dt% ms
```

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

Пусть с помощью редактора создан файл с именем f1, содержащий одну строку следующего вида: date; pwd; ls. Можно вызвать оболочку shell как команду, обозначаемую sh, и передать ей файл fl, как аргумент или как перенаправленный вход: $ sh fl или $ sh < fl. В результате выполнения любой из этих команд будет выдана дата, затем имя текущего каталога, а потом содержимое каталога.

Файл можно выполнить и в текущем экземпляре shell. Для этого существует специфическая команда . (точка): .fl.

Более удобный вариант работы с командным файлом - это превращение его в выполняемый файл, т.е. просто сделать его командой (запускающей этот файл по его названию), что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла. Например, chmod 711 fl сделает у этого файла код защиты «rwx--x--x». Тогда простой вызов fl приведет к выполнению тех же трех команд, которые были записаны в файл.

Результат будет тот же, если файл с содержимым date; pwd; ls будет представлен в виде:

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

Начинать командный файл надо всегда с пустой строки или пустого оператора «:». Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора.

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

Выходной поток может быть задан пятью способами: по умолчанию, без явного указания на выходной поток; явным указанием выходного потока; перенаправлением выходного потока одной команды на вход другой (символ |); перенаправлением в начало файла (символ «>»); перенаправлением в конец файла (символ «>>»).

Выходной поток одной команды может быть направлен во входной поток другой команды посредством организации конвейера команд. Для создания конвейера команд между объединяемыми командами ставится знак |.

Для вывода всех файлов текущего каталога на экран служит команда ls -1. Для ограничения выходного потока этой команды, вывода каталога отдельными фрагментами, служит команда more. Соединив эти две команды в конвейер ls –l| more получим, что содержимое текущего каталога готовится командой ls -l, выходной поток которой знаком конвейера | направлен на вход команды more. А команда more выводит информацию на экран с временными паузами.

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

Показать общее количество файлов в текущем каталоге: ls –l| wc –l.

Показать общее количество пользователей, работающих в данный момент на ЭВМ: who | we –l.

Показать последние 10 раз, когда заходил в систему пользователь с текущим login'ом «vasjkov»: last vasjkov | head.

Отсортировать список файлов по алфавиту, подготовить его к печати и отпечатать его: sort list | pr | lpr.

Показать состав работающих на ЭВМ пользователей в алфавитном порядке: who | sort.

Сформировать список содержимого текущего каталога, выделить размер каждого файла из списка, список отсортировать по цифрам, показать только последний (а следовательно, наибольший) файл из списка: ls -l | awk ' ' | sort -n | tail –l.

Файл «textfile» отсортировать и напечатать: sort textfile | lp.

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

Сформировать список файлов текущего каталога, преобразовать его в 3 колонки и распечатать: ls | pr -3 | lpr.

Файл «fruits» отсортировать и вывести на экран колонками, как при табуляции: sort fruits | sp.

Определить, кто входит в систему с терминала ttyl5: who |grep ttyl5.

Вывести неповторяющийся список элементов файла animals с указанием числа повторений этих элементов. Такой способностью обладает команда uniq с опцией -с: sort animals | uniq -с.

Найти в телефонном справочнике phone.lst абонента по двум критериям поиска: Тэд, живущий в Лос Анжелесе: grep Ted phone.lst | grep 'Los Angeles'.

Отформатировать текст из файла text_5 в 2 колонки перед выводом на печать: рr -2 text_5 | lpr.

Перед печатью файл data_15 сначала упорядочить, затем разделить на страницы: sort data 15 | pr | lpr.

Читайте также: