Команда «.» (точка) в Linux
Команда «.» (точка) часто используется в шелл-скриптах, однако не все знают, что это синоним команды source, встроенной в оболочку bash. Обычно говорят, что она используется для включения (подключения, «инклудинга») неких внешних файлов внутри скрипта. Рассмотрим в чём заключается суть такого подключения на примере файла .bash_profile:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
На второй строчке с помощью оператора «.» выполняется содержимое файла ~/.bashrc . Может возникнуть вопрос, почему нельзя было для этого использовать, например, sh или просто сам bash.
Дело в том, что при использовании точки не создаётся копии bash-процесса — скрипт выполняется в текущем экземпляре bash, причём все переменные окружения, инициализированные в данном скрипте после его завершения не исчезают, а передаются в окружение системы. Вот в этом и состоит суть «включения». Наоборот, если скрипт запускается явным образом с помощью sh или bash, то создаётся локальная копия (форк) bash, и по завершении скрипта в родительский bash ничего не возвращается — все переменные окружения, созданные в скрипте безвозвратно теряются.
Проиллюстрируем сказанное на простом примере. Создадим файл script следующего содержания:
testenv=»Hi there!»;
echo «Внутренняя переменная testenv = $testenv»;
Если теперь запустить скрипт с помощью sh, то на экран будет выведено значение внутренней переменной скрипта:
# sh script
# Внутренняя переменная testenv = Hi there!
Однако эта переменная не сохранится после завершения работы скрипта и не будет присутствовать в текущем окружении bash:
Если же запустить скрипт точкой, то он выполнится с тем же результатом:
# . script
# Внутренняя переменная testenv = Hi there!
Только переменная testenv будет доступна среди переменных окружения текущей системной оболочки:
# echo $testenv;
# Hi there!
Дочерняя копия bash при использовании оператора точка создаётся только в том случае, когда процесс запускается в фоновом режиме. Это единственное исключение из общего правила.
Почему команда ls добавляет точку (.) или плюс (+) к полю прав доступа некоторых файлов?
Это новая функциональность, добавленная в последние версии пакета coreutils , который включён в дистрибутив Fedora 11. Ответ на этот вопрос содержит страница информации команды ls . Посмотреть её можно командой # info ls . Вот выдержка оттуда:
За битами прав доступа следует один символ, который указывает на то, используется ли альтернативный метод контроля доступа, такой, например, как списки контроля доступа. Если этот символ отсутствует, это означает, что альтернативные методы не используется. Если же отображается какой-либо печатный символ — значит используется.
Команда GNU ls использует символ точки (.) для обозначения, что у файла есть только контекст безопасности SELinux. Если у файла присутствуют и другие методы контроля доступа в любой комбинации, он помечается символом плюс (+).
This entry was posted in Fedora FAQ and tagged basics, fedora, ls on July 6, 2009 by ivan .
Pages
- Reference Phonetic Alphabet
- Подборка вопросов и ответов #1
- Подборка вопросов и ответов #2
- Подборка вопросов и ответов #3
Linux что означает точка
Комментарии могут располагаться и в конце строки с исполняемым кодом.
echo "Далее следует комментарий." # Это комментарий.
# Перед комментарием стоит символ табуляции.
| Исполняемые команды не могут следовать за комментарием в той же самой строке. Пока что еще не существует способа отделения комментария от «исполняемого кода» , следующего за комментарием в той же строке. |
echo "Символ # не означает начало комментария." echo 'Символ # не означает начало комментария.' echo Символ \# не означает начало комментария. echo А здесь символ # означает начало комментария. echo $ # Подстановка -- не комментарий. echo $(( 2#101011 )) # База системы счисления -- не комментарий. # Спасибо, S.C.
Кавычки » ‘ и \ экранируют действие символа #.
В операциях поиска по шаблону символ # так же не воспринимается как начало комментария. ;
Разделитель команд. [Точка-с-запятой] Позволяет записывать две и более команд в одной строке.
echo hello; echo there
Ограничитель в операторе выбора case . [Двойная-точка-с-запятой]
case "$variable" in abc) echo "$variable = abc" ;; xyz) echo "$variable = xyz" ;; esac
команда «точка» . Эквивалент команды source (см. Пример 11-18). Это встроенная команда bash.
bash$ touch .hidden-file bash$ ls -l total 10 -rw-r--r-- 1 bozo 4034 Jul 18 22:04 data1.addressbook -rw-r--r-- 1 bozo 4602 May 25 13:58 data1.addressbook.bak -rw-r--r-- 1 bozo 877 Dec 17 2000 employment.addressbook bash$ ls -al total 14 drwxrwxr-x 2 bozo bozo 1024 Aug 29 20:54 ./ drwx------ 52 bozo bozo 3072 Aug 29 20:51 ../ -rw-r--r-- 1 bozo bozo 4034 Jul 18 22:04 data1.addressbook -rw-r--r-- 1 bozo bozo 4602 May 25 13:58 data1.addressbook.bak -rw-r--r-- 1 bozo bozo 877 Dec 17 2000 employment.addressbook -rw-rw-r-- 1 bozo bozo 0 Aug 29 20:54 .hidden-file
Если подразумевается имя каталога, то одна точка означает текущий каталог и две точки — каталог уровнем выше, или родительский каталог.
bash$ pwd /home/bozo/projects bash$ cd . bash$ pwd /home/bozo/projects bash$ cd .. bash$ pwd /home/bozo/
Символ точка довольно часто используется для обозначения каталога назначения в операциях копирования/перемещения файлов.
bash$ cp /home/bozo/current_work/junk/* .
Двойные кавычки . В строке «STRING» , ограниченной двойными кавычками не выполняется интерпретация большинства служебных символов, которые могут находиться в строке. см. Глава 5.
Одинарные кавычки . [Одинарные кавычки] ‘STRING’ экранирует все служебные символы в строке STRING . Это более строгая форма экранирования. Смотрите так же Глава 5.
Запятая . Оператор запятая используется для вычисления серии арифметических выражений. Вычисляются все выражения, но возвращается результат последнего выражения.
let "t2 = ((a = 9, 15 / 3))" # Присваивает значение переменной "a" и вычисляет "t2".
escape. [обратный слэш] Комбинация \X «экранирует» символ X . Аналогичный эффект имеет комбинация с «одинарными кавычками» , т.е. ‘X’ . Символ \ может использоваться для экранирования кавычек » и ‘ .
Разделитель, используемый в указании пути к каталогам и файлам. [слэш] Отделяет элементы пути к каталогам и файлам (например /home/bozo/projects/Makefile).
В арифметических операциях — это оператор деления. `
Подстановка команд. [обратные кавычки] Обратные кавычки могут использоваться для записи в переменную команды `command` .
: echo $? # 0
while : do operation-1 operation-2 . operation-n done # То же самое: # while true # do # . # done
Символ-заполнитель в условном операторе if/then:
if condition then : # Никаких действий не производится и управление передается дальше else take-some-action fi
: $ # $ без символа : выдает сообщение об ошибке, # если "username" не является командой.
Как символ-заполнитель для оператора вложенного документа. См. Пример 17-9. В операциях с подстановкой параметров (см. Пример 9-13).
: $ $ $ #Вывод сообщения об ошибке, если одна или более переменных не определены.
В операциях замены подстроки с подстановкой значений переменных. В комбинации с оператором > ( оператор перенаправления вывода), усекает длину файла до нуля. Если указан несуществующий файл — то он создается.
: > data.xxx # Файл "data.xxx" -- пуст # Тот же эффект имеет команда cat /dev/null >data.xxx # Однако в данном случае не производится создание нового процесса, поскольку ":" является встроенной командой.
| Вышеизложенное применимо только к обычным файлам и неприменимо к конвейерам, символическим ссылкам и другим специальным файлам. |
Символ : может использоваться для создания комментариев, хотя и не рекомендуется. Если строка комментария начинается с символа # , то такая строка не проверяется интерпретатором на наличие ошибок. Однако в случае оператора : это не так.
: Это комментарий, который генерирует сообщение об ошибке, ( if [ $x -eq 3] ).
bash$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
инверсия (или логическое отрицание) используемое в условных операторах. Оператор ! инвертирует код завершения команды, к которой он применен. (см. Пример 6-2). Так же используется для логического отрицания в операциях сравнения, например, операция сравнения «равно» ( = ), при использовании оператора отрицания, преобразуется в операцию сравнения — «не равно» ( != ). Символ ! является зарезервированным ключевым словом BASH.
В некоторых случаях символ ! используется для косвенного обращения к переменным. Кроме того, из командной строки оператор ! запускает механизм историй Bash (см. Приложение F). Примечательно, что этот механизм недоступен из сценариев (т.е. исключительно из командной строки). *
символ-шаблон. [звездочка] Символ * служит «шаблоном» для подстановки в имена файлов. Одиночный символ * означает любое имя файла в заданном каталоге.
bash$ echo * abs-book.sgml add-drive.sh agram.sh alias.sh
В регулярных выражениях токен * представляет любое количество (в том числе и 0) символов. *
арифметический оператор. В арифметических выражениях символ * обозначает операцию умножения.
Оператор проверки условия. В некоторых выражениях символ ? служит для проверки выполнения условия.
В конструкциях с двойными скобками, символ ? подобен трехместному оператору языка C. См. Пример 9-28. В выражениях с подстановкой параметра, символ ? проверяет — установлена ли переменная. ?
сивол-шаблон. Символ ? обозначает одиночный символ при подстановке в имена файлов. В регулярных выражениях служит для обозначения одиночного символа.
var1=5 var2=23skidoo echo $var1 # 5 echo $var2 # 23skidoo
Символ $ , предшествующий имени переменной, указывает на то, что будет получено значение переменной. $
end-of-line (конец строки). В регулярных выражениях, символ «$» обозначает конец строки.
код завершения. Переменная $? хранит код завершения последней выполненной команды, функции или сценария.
id процесса. Переменная $$ хранит id процесса сценария.
группа команд.
(a=hello; echo $a)
a=123 ( a=321; ) echo "a = $a" # a = 123 # переменная "a" в скобках подобна локальной переменной.
инициализация массивов.
Array=(element1 element2 element3)
Фигурные скобки.
grep Linux file*. # Поиск всех вхождений слова "Linux" # в файлах "fileA.txt", "file2.txt", "fileR.html", "file-87.htm", и пр.
| Использование неэкранированных или неокавыченных пробелов внутри фигурных скобок недопустимо. echo \ : file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C |
bash$ bash: local: can only be used in a function
a=123 < a=321; >echo "a = $a" # a = 321 (значение, присвоенное во вложенном блоке кода) # Спасибо, S.C.
Пример 3-1. Вложенные блоки и перенаправление ввода-вывода
#!/bin/bash # Чтение строк из файла /etc/fstab. File=/etc/fstab < read line1 read line2 >< $File echo "Первая строка в $File :" echo "$line1" echo echo "Вторая строка в $File :" echo "$line2" exit 0
Пример 3-2. Сохранение результата исполнения вложенного блока в файл
#!/bin/bash # rpm-check.sh # Запрашивает описание rpm-архива, список файлов, и проверяется возможность установки. # Результат сохраняется в файле. # # Этот сценарий иллюстрирует порядок работы со вложенными блоками кода. SUCCESS=0 E_NOARGS=65 if [ -z "$1" ] then echo "Порядок использования: `basename $0` rpm-file" exit $E_NOARGS fi < echo echo "Описание архива:" rpm -qpi $1 # Запрос описания. echo echo "Список файлов:" rpm -qpl $1 # Запрос списка. echo rpm -i --test $1 # Проверка возможности установки. if [ "$?" -eq $SUCCESS ] then echo "$1 может быть установлен." else echo "$1 -- установка невозможна!" fi echo >> "$1.test" # Перенаправление вывода в файл. echo "Результаты проверки rpm-архива находятся в файле $1.test" # За дополнительной информацией по ключам команды rpm см. man rpm. exit 0
| Обратите внимание на то, что символ " ; " , которым завершается ключ -exec команды find, экранируется обратным слэшем. Это необходимо, чтобы предотвратить его интерпретацию. |
test.
Проверка истинности выражения, заключенного в квадратные скобки [ ]. Примечательно, что [ является частью встроенной команды test (и ее синонимом), И не имеет никакого отношения к "внешней" утилите /usr/bin/test. [[ ]]
test.
элемент массива.
При работе с массивами в квадратных скобках указывается порядковый номер того элемента массива, к которому производится обращение.
Array[1]=slot_1 echo $
диапазон символов.
В регулярных выражениях, в квадратных скобках задается диапазон искомых символов. (( ))
двойные круглые скобки.
Конструкция scriptname >filename перенаправляет вывод scriptname в файл filename. Если файл filename уже существовал, то его прежнее содержимое будет утеряно. Конструкция command &>filename перенаправляет вывод команды command, как со stdout, так и с stderr, в файл filename. Конструкция command >&2 перенаправляет вывод со stdout на stderr. Конструкция scriptname >>filename добавляет вывод scriptname к файлу filename. Если задано имя несуществующего файла, то он создается.
(command)> В операциях сравнения, символы " < " и " >" обозначают операции сравнения строк . А так же -- операции сравнения целых чисел. См. так же Пример 12-6.
veg1=carrots veg2=tomatoes if [[ "$veg1" < "$veg2" ]] then echo "Не смотря на то, что в словаре слово $veg1 предшествует слову $veg2," echo "это никак не отражает мои кулинарные предпочтения." else echo "Интересно. Каким словарем вы пользуетесь?" fi
границы отдельных слов в регулярных выражениях.
конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку.
echo ls -l | sh # Передает вывод "echo ls -l" команлному интерпретатору shell, #+ тот же результат дает простая команда "ls -l". cat *.lst | sort | uniq # Объединяет все файлы ".lst", сортирует содержимое и удаляет повторяющиеся строки.
Конвейеры (еще их называют каналами) -- это классический способ взаимодействия процессов, с помощью которого stdout одного процесса перенаправляется на stdin другого. Обычно используется совместно с командами вывода, такими как cat или echo, от которых поток данных поступает в "фильтр" (команда, которая на входе получает данные, преобразует их и обрабатывает). cat $filename | grep $search_word
В конвейер могут объединяться и сценарии на языке командной оболочки.
#!/bin/bash # uppercase.sh : Преобразование вводимых символов в верхний регистр. tr 'a-z' 'A-Z' # Диапазоны символов должны быть заключены в кавычки #+ чтобы предотвратить порождение имен файлов от однобуквенных имен файлов. exit 0
А теперь попробуем объединить в конвейер команду ls -l с этим сценарием.
bash$ ls -l | ./uppercase.sh -RW-RW-R-- 1 BOZO BOZO 109 APR 7 19:49 1.TXT -RW-RW-R-- 1 BOZO BOZO 109 APR 14 16:48 2.TXT -RW-R--R-- 1 BOZO BOZO 725 APR 20 20:56 DATA-FILE
cat file1 file2 | ls -l | sort # Вывод команды "cat file1 file2" будет утерян.
Конвейер исполняется в дочернем процессе, а посему -- не имеет доступа к переменным сценария.
variable="initial_value" echo "new_value" | read variable echo "variable = $variable" # variable = initial_value
логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).
Выполнение задачи в фоне. Команда, за которой стоит & , будет исполняться в фоновом режиме.
bash$ sleep 10 & [1] 850 [1]+ Done sleep 10
В сценариях команды, и даже циклы могут запускаться в фоновом режиме.
Пример 3-3. Запуск цикла в фоновом режиме
#!/bin/bash # background-loop.sh for i in 1 2 3 4 5 6 7 8 9 10 # Первый цикл. do echo -n "$i " done & # Запуск цикла в фоне. # Иногда возможны случаи выполнения этого цикла после второго цикла. echo # Этот 'echo' иногда не отображается на экране. for i in 11 12 13 14 15 16 17 18 19 20 # Второй цикл. do echo -n "$i " done echo # Этот 'echo' иногда не отображается на экране. # ====================================================== # Ожидается, что данный сценарий выведет следующую последовательность: # 1 2 3 4 5 6 7 8 9 10 # 11 12 13 14 15 16 17 18 19 20 # Иногда возможен такой вариант: # 11 12 13 14 15 16 17 18 19 20 # 1 2 3 4 5 6 7 8 9 10 bozo $ # (Второй 'echo' не был выполнен. Почему?) # Изредка возможен такой вариант: # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # (Первый 'echo' не был выполнен. Почему?) # Крайне редко встречается и такое: # 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20 # Второй цикл начал исполняться раньше первого. exit 0
Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).
префикс ключа. С этого символа начинаются опциональные ключи команд.
COMMAND -[Option1][Option2][. ] ls -al sort -dfu $filename set -- $variable
if [ $file1 -ot $file2 ] then echo "Файл $file1 был создан раньше чем $file2." fi if [ "$a" -eq "$b" ] then echo "$a равно $b." fi if [ "$c" -eq 24 -a "$d" -eq 47 ] then echo "$c равно 24, а $d равно 47." fi
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -) # Перемещение полного дерева файлов и подкаталогов из одной директории в другую # [спасибо Алану Коксу (Alan Cox) , за небольшие поправки] # 1) cd /source/directory Переход в исходный каталог, содержимое которого будет перемещено # 2) && "И-список": благодаря этому все последующие команды будут выполнены # только тогда, когда 'cd' завершится успешно # 3) tar cf - . ключом 'c' архиватор 'tar' создает новый архив, # ключом 'f' (file) и последующим '-' задается файл архива -- stdout, # в архив помещается текущий каталог ('.') с вложенными подкаталогами. # 4) | конвейер с . # 5) ( . ) subshell-ом (дочерним экземпляром командной оболочки) # 6) cd /dest/directory Переход в каталог назначения. # 7) && "И-список", см. выше # 8) tar xpvf - Разархивирование ('x'), с сохранением атрибутов "владельца" и прав доступа ('p') к файлам, # с выдачей более подробных сообщений на stdout ('v'), # файл архива -- stdin ('f' с последующим '-'). # # Примечательно, что 'x' -- это команда, а 'p', 'v' и 'f' -- ключи # Во как! # Более элегантный вариант: # cd source-directory # tar cf - . | (cd ../target-directory; tar xzf -) # # cp -a /source/directory /dest имеет тот же эффект.
bunzip2 linux-2.4.3.tar.bz2 | tar xvf - # --разархивирование tar-файла-- | --затем файл передается утилите "tar"-- # Если у вас утилита "tar" не поддерживает работу с "bunzip2", # тогда придется выполнять работу в два этапа, с использованием конвейера. # Целью данного примера является разархивирование тарбола (tar.bz2) с исходными текстами ядра.
Обратите внимание, что в этом контексте "-" - не самостоятельный оператор Bash, а скорее опция, распознаваемая некоторыми утилитами UNIX (такими как tar, cat и т.п.), которые выводят результаты своей работы в stdout.
bash$ echo "whatever" | cat - whatever
В случае, когда ожидается имя файла, тогда "-" перенаправляет вывод на stdout (вспомните пример с tar cf) или принимает ввод с stdin.
bash$ file Usage: file [-bciknvzL] [-f namefile] [-m magicfiles] file.
Сама по себе команда file без параметров завершается с сообщением об ошибке.
Добавим символ "-" и получим более полезный результат. Это заставит командный интерпретатор ожидать ввода от пользователя.
bash$ file - abc standard input: ASCII text bash$ file - #!/bin/bash standard input: Bourne-Again shell script text executable
Теперь команда принимает ввод пользователя со stdin и анализирует его.
Используя передачу stdout по конвейеру другим командам, можно выполнять довольно эффектные трюки, например вставка строк в начало файла. С помощью команды diff -- находить различия между одним файлом и частью другого: grep Linux file1 | diff file2 - И наконец пример использования служебного символа "-" с командой tar.
Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток
#!/bin/bash # Резервное архивирование (backup) всех файлов в текущем каталоге, # которые были изменены в течение последних 24 часов #+ в тарболл (tarball) (.tar.gz - файл). BACKUPFILE=backup archive=$ # На случай, если имя архива в командной строке не задано, #+ т.е. по-умолчанию имя архива -- "backup.tar.gz" tar cvf - `find . -mtime -1 -type f -print` > $archive.tar gzip $archive.tar echo "Каталог $PWD заархивирован в файл \"$archive.tar.gz\"." # Stephane Chazelas заметил, что вышеприведенный код будет "падать" #+ если будет найдено слишком много файлов #+ или если имена файлов будут содержать символы пробела. # Им предложен альтернативный код: # ------------------------------------------------------------------- # find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar" # используется версия GNU утилиты "find". # find . -mtime -1 -type f -exec tar rvf "$archive.tar" '<>' \; # более универсальный вариант, хотя и более медленный, # зато может использоваться в других версиях UNIX. # ------------------------------------------------------------------- exit 0
var="-n" echo $var # В данном случае команда приобретет вид "echo -n" и ничего не выведет.
Символ точка — путь к началу:)
Сегодня всё больше людей переходят на Linux, так как она бесплатна и не нуждается в антивирусе. И дело даже не в цене, так как купил Windows 8 может позволить себе сегодня каждый, дело больше в стабильности работе Linux и её гибкости. Но единственной проблемой, которая мешает некоторым перейти на Linux — это миф о её сложности.
Но на самом деле это конечно не так. Просто в Linux принято пользоваться консольными программами, это удобно, и на самом деле не сложно. И вот я сейчас расскажу об ещё одной полезной фишке, которую нужно знать. Итак, символ точка…

Давайте рассмотрим возможную двусмысленную ситуацию, предположив, что вы ввели команду cd ~ для задания домашней папки как вашего рабочего каталога, и сохранили в ней программу, названную find. В данном случае вы можете полагать, что, если ввести find, программа запустится, но этого не произойдет, потому что существует программа find, находящаяся в папке /usr/bin, и Linux по умолчанию выполнит этот файл, потому что он включен в системный путь, который просматривается до просмотра текущей папки.
Одно из возможных решений — ввести программу с абсолютным или относительным путем и именем файла, например: