Next Previous Contents

## 5. Файлы и программы

## 5.1 Файлы: Предварительные замечания

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

- в DOS, имена файлов хранятся в так называемом формате 8.3; например `NOTENOUG.TXT`. В Linux мы можем делать лучше. Если вы установили Linux, используя файловую систему, подобную ext2 или umsdos, то вы можете использовать более длинные имена файлов (до 255 символов), и с более чем одной точкой в имени: например, `This_is.a.VERY_long.filename`. Пожалуйста заметьте, что я использовал символы и верхнего и нижнего регистра: в действительности...
- символы верхнего и нижнего регистра в именах файлов отличаются друг от друга. Поэтому `FILENAME.tar.gz` и `filename.tar.gz` являются разными файлами. `ls` является командой, а `LS` является ошибкой;
- пользователи Windows, будьте осторожны при использовании длинных имен в Linux. Если имя файла содержит пробелы (не рекомендуется, но возможно), то вы должны заключить имя файла в двойные кавычки при обращении к нему. Например:

  > `

  >     $ # следующая команда создает каталог, названный "My old files"
  >     $ mkdir "My old files"
  >     $ ls
  >     My old files    bin     tmp

  > `

  А Также некоторые символы не должны использоваться: это `!*$&#`.
- не существует обязательных расширений типа `.COM` и `.EXE` для программ или `.BAT` для командных файлов. Исполнимые файлы отмечаются символом звездочка ``*`' в конце их имен, при использовании команды `ls -F`. Например:

  > `

  >     $ ls -F
  >     I_am_a_dir/   cindy.jpg    cjpg*   letter_to_Joe    my_1st_script*  old~

  > `

  Файлы `cjpg*` и `my_1st_script*` являются исполнимыми, то есть ``программами''. В DOS, файлы резервных копий заканчиваются на `.BAK`, тогда как под Linux они заканчиваются на знак тильды ``~`'. Также файл, чье имя начинается со знака точки, считается скрытым. Например: файл `.I.am.a.hidden.file` не будет показан при выполнении команды `ls`;
- Ключи командной строки (switches) программ DOS задаются в виде `/switch`, Linux использует ключи в виде `-switch` или `--switch`. Пример: `dir /s` становится `ls -R`. Заметим, что много программ DOS, такие как `PKZIP` или `ARJ`, используют ключи в стиле UNIX.

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

## 5.2 Символьные ссылки

В UNIX имеется тип файлов, которых нет в DOS: символьные ссылки. Он может быть описан как ссылка на файл или каталог и может быть использован вместо файла или каталога, на который она указывает; они сходны с ярлыками в Windows. Примером символьный ссылки может быть `/usr/X11`, которая указывает на каталог `/usr/X11R6`, или `/dev/modem`, который указывает либо на `/dev/ttyS0` либо на `/dev/ttyS1`.

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

> `

>     $ ln -s <file_or_dir> <linkname>

> `

Пример:

> `

>     $ ln -s /usr/doc/g77/DOC g77manual.txt

> `

Теперь вы можете ссылаться на `g77manual.txt` вместо `/usr/doc/g77/DOC`. Ссылки показываются следующим образом в списке файлов каталога:

> `

>     $ ls -F
>     g77manual.txt@
>     $ ls -l
>     (разные вещи...)           g77manual.txt -> /usr/doc/g77/DOC

> `

## 5.3 Права доступа и владение

Файлы и каталоги DOS имеют следующие атрибуты: A (архивный), H (скрытый), R (только чтение) и S (системный). В Linux только H и R имеют значение: скрытые файлы начинаются с точки, а для того чтобы задать атрибут R, читайте дальше.

В UNIX файл имеет ``права доступа'' и ``владельца'', который относится к ``группе''. Посмотрите пример:

> `

>     $ ls -l /bin/ls
>     -rwxr-xr-x  1  root  bin  27281 Aug 15 1995 /bin/ls*

> `

Первое поле содержит права доступа к файлу `/bin/ls`, который принадлежит пользователю root, группы bin. Опуская другую информацию, запомните, что означает `-rwxr-xr-x`, слева направо:

`-` это тип файла (`-` = обычный файл, `d` = каталог, `l` = ссылка, и т.д.); `rwx` являются правами доступа для владельца файла (чтение, запись, выполнение); `r-x` являются правами доступа для группы, к которой относится владелец файла (чтение, выполнение); (Я не хочу делать обозрение концепции групп, вы можете выжить без нее, поскольку вы начинающий пользователь ;-) `r-x` являются правами доступа для всех остальных пользователей (чтение, выполнение).

Каталог `/bin` тоже имеет права доступа: смотрите раздел <@@ref>Права доступа к каталогамDirectories Permissions для дополнительной информации. Вот поэтому вы не можете удалить файл `/bin/ls` до тех пор, пока не станете пользователемroot: вы просто не имеете прав сделать это. Для изменения прав доступа к файлу используется команда:

> `

>     $ chmod <whoXperm> <file>

> `

где who---это `u` (пользователь, который является владельцем), `g` (группа), `o` (остальные), X---это либо `+`, либо `-`, perm---это `r` (чтение), `w` (запись), или `x` (выполнение). Вот общие примеры использования команды `chmod`:

> `

>     $ chmod +x file

> `

устанавливает право на выполнения данного файла.

> `

>     $ chmod go-rw file

> `

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

> `

>     $ chmod ugo+rwx file

> `

дает всем права на чтение, запись и выполнение.

> `

>     # chmod +s file

> `

делает так называемый ``setuid'' или ``suid'' файл---файл, который любой может выполнять с привилегиями владельца. Обычно, это применяется к файлам, владельцем которых является root; часто это важные системный файлы, такие как X-сервер.

Более коротким способом для ссылки на права доступа является использование цифрового обозначения: `rwxr-xr-x` может быть выражен как 755 (каждый символ соответствует биту: `---` равен 0, `--x` равен 1, `-w-` равен 2, `-wx` равен 3...). Это выглядит трудным, но, немного попрактиковавшись, вы поймете концепцию. root, будучи администратором, может изменять права доступа на файлы любого пользователя. RMP.

## 5.4 Файлы: Перевод команд

На левой стороне находятся команды DOS; справа их аналоги в Linux.

> `

>     ATTRIB:         chmod
>     COPY:           cp
>     DEL:            rm
>     MOVE:           mv
>     REN:            mv
>     TYPE:           more, less, cat

> `

Операторы перенаправления и конвейеризации: `< > >> |`

Символы шаблонов: `* ?`

`устройство nul: /dev/null`

`Устройства prn, lpt1: /dev/lp0 or /dev/lp1; lpr`

### Примеры

> `

>     DOS                                     Linux
>     ---------------------------------------------------------------------

>     C:\\GUIDO>ATTRIB +R FILE.TXT             $ chmod 400 file.txt
>     C:\\GUIDO>COPY JOE.TXT JOE.DOC           $ cp joe.txt joe.doc
>     C:\\GUIDO>COPY *.* TOTAL                 $ cat * > total
>     C:\\GUIDO>COPY FRACTALS.DOC PRN          $ lpr fractals.doc
>     C:\\GUIDO>DEL TEMP                       $ rm temp
>     C:\\GUIDO>DEL *.BAK                      $ rm *~
>     C:\\GUIDO>MOVE PAPER.TXT TMP\\           $ mv paper.txt tmp/
>     C:\\GUIDO>REN PAPER.TXT PAPER.ASC        $ mv paper.txt paper.asc
>     C:\\GUIDO>PRINT LETTER.TXT               $ lpr letter.txt
>     C:\\GUIDO>TYPE LETTER.TXT                $ more letter.txt
>     C:\\GUIDO>TYPE LETTER.TXT                $ less letter.txt
>     C:\\GUIDO>TYPE LETTER.TXT > NUL          $ cat letter.txt > /dev/null
>             n/a                              $ more *.txt *.asc
>             n/a                              $ cat section*.txt | less

> `

Примечания:

- `*` намного ``умнее '' в Linux: `*` соответствует всем файлам, за исключением скрытых; `.*` соответствует всем скрытым файлам (но также текущему каталогу ``.`' и каталогу уровнем выше ``..`': beware!); `*.*` соответствует только тем, которые имеют ``.`' в середине имени, или оканчиваются на точку; `p*r` соответствует и `peter' и `piper'; `*c*` соответствует и `picked' и `peck';
- при использовании `more`, необходимо нажимать на клавишу <SPACE> для того, чтобы продвигаться по файлу, и `q' для выхода. `less` является более интуитивно понятной командой и позволяет вам использовать клавиши управления курсором;
- нет команды `UNDELETE` (восстановления после удаления), так что дважды подумайте до удаления чего-либо;
- в добавлении к используемым в DOS' `< > >>`, в Linux имеется `2>` для перенаправления сообщений об ошибках (stderr); более того, `2>&1` перенаправляет stderr в stdout, в то время как `1>&2` перенаправляет stdout в stderr;
- Linux имеет дополнительный шаблон (wildcard): `[]`. Использование: `[abc]*` соответствует файлам, начинающимся с a, b, c; `*[I-N1-3]` соответствует файлам, оканчивающимся на I, J, K, L, M, N, 1, 2, 3;
- команда `lpr` <file> печатает файл в фоновом режиме. Для проверки состояния очереди печати используйте команду `lpq`; для удаления файла из очереди печати используйте `lprm`;
- нет команды, похожей на команду `RENAME` в DOS; так что команда `mv *.xxx *.yyy` не будет работать. команда, похожая на REN, доступна с ftp://metalab.unc.edu/pub/Linux/utils/file;
- используйте команды `cp -i` и `mv -i` для того, чтобы вас предупредили, когда файл будет перезаписываться.

## 5.5 Запуск программ: Многозадачность и сеансы работы

Для запуска программы просто наберите ее имя, так как вы делали это в DOS. Если каталог (Раздел Использование каталогов), где находится программа, находится в переменной среды PATH (Раздел Файлы инициализации системы), то программа будут запущена. Исключение: в отличии от DOS, в Linux программа, расположенная в текущем каталоге, не будет запускаться до тех пор, пока вы не включите этот каталог в PATH. Предупреждение: если `prog` это ваша программа, то наберите `./prog` для ее запуска из текущего каталога.

Типичная командная строка выглядит примерно так:

> `

>     $ command [-s1 [-s2] ... [-sn]] [par1 [par2] ... [parn]] [< input] [> output]

> `

где `-s1`, ..., `-sn` являются ключами программы, а `par1`, ..., `parn` являются параметрами программы. Вы можете запустить несколько команд из одной командной строки:

> `

>     $ command1 ; command2 ; ... ; commandn

> `

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

- Для того,чтобы переключится в сеанс 1..6 на виртуальных консолях, нажмите <ALT-F1> ... <ALT-F6>
- Для запуска нового сеанса в той же самой виртуальной консоли без выхода из нее, наберите `su - <loginname>`. Пример: `su - root`. Это полезно, например, когда вам надо выполнить задачу, которую может выполнить только root.
- Для окончания сеанса работы наберите `exit`. Если у вас есть приостановленные задания (смотрите дальше), то вас предупредят.
- Для запуска процесса в фоновом режиме, добавьте знак амперсанда '`&`' в конец командной строки:

  > `

  >     $ progname [-switches] [parameters] [< input] [> output] &
  >     [1] 123

  > `

  Командный процессор идентифицирует процессы по номеру задания (например `[1]`; смотрите ниже), и по PID (Идентификационный номер процесса; 123 в нашем примере).
- Для того, чтобы увидеть, сколько процессов запущено, наберите `ps ax`. Эта команда выдаст список запущенных в настоящее время процессов.
- Для того чтобы убить, (завершить) процесс, наберите команду `kill <PID>`. Вам может понадобиться убить процесс в том случае, если вы не знаете, как его правильно завершить... До тех пор, пока вы не станете root, вы не сможете завершать процессы других людей. Иногда процесс может быть завершен только используя команду `kill -SIGKILL <PID>`. В дополнение командный процессор позволяет вам остановить или временно приостановить процесс, перевести процесс в фоновый режим, и перевести процесс из фонового режима в интерактивный режим. В этом контексте процессы называются ``заданиями''.
- Для того чтобы узнать, сколько заданий существует наберите `jobs`. Здесь задания идентифицируются по номеру задания, а не по их PID.
- Для того, чтобы остановить процесс, запущенный в интерактивном режиме, нажмите <CTRL-C> (это не всегда работает).
- Для того, чтобы приостановить процесс, запущенный в интерактивном режиме , нажмите <CTRL-Z> (то же самое).
- Для перевода приостановленного процесса в фоновый режим, наберите `bg <%job>` (он станет заданием).
- Для перевода задания в интерактивный режим наберите `fg <%job>`. Для перевода в интерактивный режим последнего задания, запущенного в фоновом режиме, просто наберите `fg`.
- Для завершения задания наберите `kill <%job>`, где <job> может быть 1, 2, 3,...

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

## 5.6 Запуск программ на удаленных компьютерах

Для запуска программы на удаленной машине, чьим именем является `remote.machine.edu`:

> `

>     $ telnet remote.machine.edu

> `

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

Если у вас есть X11, вы даже можете запустить приложение для X на удаленной машине, отображая его на вашем экране X Windows. Допустим, что `remote.machine.edu`> -- это удаленный компьютер с X и допустим, что `local.linux.box` -- это ваша машина с Linux. Для запуска с `local.linux.box` программы для X, которая расположена на `remote.machine.edu`, выполните следующее:

- запустите X11, запустите `xterm` или подобный эмулятор терминала, затем наберите:

  > `

  >     $ xhost +remote.machine.edu
  >     $ telnet remote.machine.edu

  > `

- После входа в систему наберите:

  > `

  >     remote:$ DISPLAY=local.linux.box:0.0
  >     remote:$ progname &

  > `

  (вместо `DISPLAY...`, вам может понадобиться написать: `setenv DISPLAY local.linux.box:0.0`. Это зависит от командного процессора на удаленной машине).

И все! Теперь `progname` будет запущена на `remote.machine.edu` и будет отображаться на вашей машине. Не пытайтесь делать это через модем, это слишком медленно, чтобы можно было пользоваться. Более того, это грубый и небезопасный метод: пожалуйста прочитайте ``Remote X Apps mini-HOWTO'' по адресу http://www.linuxdoc.org/HOWTO/mini/Remote-X-Apps.html.

Next Previous Contents