Библиотека сайта rus-linux.net
3. Файлы и программы
3.1. Файлы: предварительные понятия
Linux имеет структуру каталогов и файлов, очень похоже на DOS/Win. Файлы имеют имена, которые подчиняются специальным правилам, хранятся в каталогах, некоторые являются выполнимыми, и большинство из них имеют командные ключи. Кроме того, Вы можете использовать маски имен файлов, перенаправление ввода-вывода и конвейеры. Только имеется несколько маленьких отличий:
-
Под 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 95, будьте осторожны при использовании длинных имен
файлов под Linux. Если имя файла содержит пробелы (не рекомендуется, но
возможно), Вы должны включить имя файла в двойные кавычки всякий раз, когда
Вы обращаетесь к нему. Например:
Далее, некоторые символы не должны использоваться: некоторые - это$ # the following command makes a directory called "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; -
ключи DOS программ указываются как
/switch, в Linux как-switchили--switch. Пример:dir /sсоотвествуетls -R. Заметьте, что многие DOS программы, типаPKZIPилиARJ, используют ключи как в UNIX.
Теперь вы можете перейти к разделу "Трансляция команд из DOS в Linux", но на вашем месте я бы прочитал
3.2. Символические связи
UNIX имеет тип файла, который не существует под DOS - это символическая связь.
О нем можно думать как о указателе на файл или каталог, и можно использовать
вместо файла или каталога, на который он указывает; он напоминает шорткаты
Windows 95. Примеры символических связей - /usr/X11, который указывает на
/usr/X11R6; /dev/modem, который указывает или на /dev/cua0 или /dev/cua1.
Чтобы создать символическую связь используется команда ln:
$ 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
3.3. Права доступа и владение
Файлы DOS и каталоги имеют следующие атрибуты: A(архив), H(скрытый), R(только для чтения), и S(системный). Только H и R имеют смысл в Linux: невидимые файлы начинаются с точки, а 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 тоже имеет права доступа: см. Раздел "Права доступа каталогов"
для дальнейших подробностей. Это - та причина, по которой Вы не можете
удалить файл /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 suid файлами; они часто являются важными системными файлами, например, X сервер.
Более короткий способ обращения к правам доступа - цифрами: rwxr-xr-x может
быть выражен числом, поскольку 755 (каждый символ соответствует биту: --- -
это 0, --x - это 1, -w- - это 2, -wx - это 3 ...). Это выглядит сложновато,
но, практикуясь, вы поймете эту концепцию.
Root, являясь суперпользователем, может изменять любые права доступа к
файлам. RMP.
3.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:*соответствует всем файлам за исключением скрытых;.*соответствует всем невидимым файлам (но также и текущему каталогу "." и каталогу предыдущего уровня "..": будьте осторожны!);*.*соответствует только тем файлам, которые имеют "." в середине или конце;p*rсоответствует и "peter", и "piper";*c*соответствует, и "picked" и "peck"; -
при использовании
more, нажмите ПРОБЕЛ, чтобы продолжить чтение файла, "q" чтобы выйти.lessболее интуитивен и позволяет Вам использовать клавиши курсора; - перед удалением файла дважды подумайте, потому что команды UNDELETE нет;
-
в добавление к операторам DOS'а
< > >>, Linux имеет2>для перенаправления сообщений об ошибках (stderr); кроме того,2>&1перенаправитstderrвstdout, в то время как1>&2перенаправитstdoutвstderr; -
в Linux есть еще одна маска для файлов:
[]. Использование:[abc]*выберет файлы начинающиеся сa, b, c;*[I-N1-3]выберет файлы, заканчивающиеся наI, J, K, L, M, N, 1, 2, 3; -
lpr <file>печатает файл в фоновом режиме. Для проверки статуса очереди печати, используйтеlpq; чтобы удалить файл из очереди печати, используйтеlprm; -
команда вроде DOSовского
RENAMEотсутствует; то естьmv *.xxx* .yyyне будет работать. Вы можете попробовать этот простой скрипт; см. раздел ``Скрипты shell: .BAT файлы, объевшиеся стероидов'' для подробностей.
#!/bin/sh # ren: rename multiple files according to several rules if [ $# -lt 3 ] ; then echo "usage: ren \"pattern\" \"replacement\" files..." exit 1 fi OLD=$1 ; NEW=$2 ; shift ; shift for file in $* do new=`echo ${file} | sed s/${OLD}/${NEW}/g` mv ${file} $new done
Осторожно: он не соответствует DOSовскомуREN, поскольку использует "регулярные выражения", который Вы все еще не знаете. Короче, если Вы просто хотите изменять расширения файла, используйте его так:ren "htm$" "html" *htm. Не забудьте знак$. -
чтобы получать предупреждения перед попыткой перезаписи файла, используйте
cp -i и mv -i
3.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>
-
чтоб начать новый сеанс на той же самой виртуальной консоли (vc) без выхода
из текущего сеанса, напечатайте
su - <loginname>. Пример:su - root. Это полезно, например, когда Вы должны выполнить задачу, для которой требуются права root -
чтобы закончить сеанс, напечатайте
exit. Если имеются остановленные работы (см. далее), то вы получите предупреждение. -
чтобы запустить процесс в фоновом режиме, добавьте символ & в конце
командной строки:
shell идентифицирует процесс номером работы (например$ progname [-switches] [parameters] [< input] [> output] & [1] 123[1]; см. ниже) и PID (Идентификационным Номером Процесса); в нашем примере 123). -
чтобы посмотреть, какие процессы запущены, напечатайте
ps -ax, и вы увидите список запущенных процессов. -
чтобы уничтожить процесс, напечатайте,
kill <PID>. Вы может понадобиться прибить процесс, когда Вы не знаете, как правильно выйти из него .... Если вы не root, то Вы не можете уничтожать процессы других людей. Иногда, процесс уничтожатется только с помощьюkill -SIGKILL <PID>.Кроме того, shell позволяет Вам останавливать или временно приостанавливать процесс, переводить процесс в фоновый режим и переводить процесс из фонового режима в активный режим. В этом контексте, процессы называются "работами".
-
чтобы узнать количество работ, напечатайте
jobs. Здесь работы идентифицированы своими номерами работы, а не их PID. - чтобы остановить процесс, протекающий в активном режиме, нажмите <CTRL-C> (это не всегда срабатывает).
- чтобы приостановить процесс, протекающий в активном режиме, нажмите <CTRL-Z> (тоже самое).
- чтобы перевести приостановленный процесс в фоновый режим, напечатайте bg <работа> (он становится работой).
-
чтобы перевести работу в активный режим, напечатайте fg <работа>. Чтобы
перевести в активный режим последнюю переведенную в фоновый режим работу,
просто напечатайте
fg. -
чтобы уничтожить работу, напечатайте
kill <%работа>, где <работа> может быть 1, 2, 3, ...
Используя эти команды, Вы можете форматировать диск, паковать насколько файлов, компилировать программу и распаковывать архив одновременно и все еще иметь командную строку в вашем распоряжении. Пробуйте это сделать в DOS! И посмотрите как это будет работать в Windows, чтобы увидеть различие в эффективности (если Windows не упадет, конечно).
3.6. Запуск программ на удаленных компьютерах
Чтобы запустить программу на удаленной машине, чей IP адрес -
remote.machine.edu, выполните:
$ telnet remote.machine.edu
После регистрации на удаленной машине, запустите вашу любимую программу. Само собой разумеется, Вы должны иметь доступ к shell на удаленной машине.
Если у Вас установлен X11, то Вы можете даже запустить X приложение на
удаленном компьютере, отображаая его на вашем X экране. Допустим, что
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. Это зависит от удаленного shell.)
Вуаля! Теперь progname запустится на remote.machine.edu и будет отображаться
на вашей машине. Не пробуйте это на модемных соединениях, такая связь слишком
медленна, чтобы быть пригодной для использования.
