Skip to main content 41q.ru

Точка (.) в Шелл

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

code snippet start

$ cat /usr/you/bin/games
PATH=$PATH:/usr/games Добавить /usr/games в PATH
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
$ . games
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin:/usr/games
$

code snippet end

— 3.6. Переменные оболочки Программное окружение Unix (Керниган, Пайк)

Попробовал я создать простенький файл в текущей директории с командой echo.

code snippet start

$ echo 'echo hi' >ech
$ ls
ech

code snippet end

И исполнить его

code snippet start

$ . ech
dash: 33: .: ech: not found

code snippet end

Чзх?

Я использовал dash. Вроде как, самый трушный из доступных сегодня шеллов.

tldr; интерпретация команд через точку работает где как. Я нашел доступное объяснение (загуглил) в руководстве z/os.

If there are slashes in the file name, . (dot) looks for the named file. If there are no slashes . (dot) searches for file in the directories specified in the PATH variable.

руководство z/os (ibm.com)

То есть, если путь до файла, который нужно исполнить не содержит косых черт - то оболочка ищет его в PATH. Если содержит косые черты (в моём случае ./ech) то будет исполнен этот файл.

Нашел описание этого поведения в posix-стандарте

А в руководстве dash об этом ни слова

code snippet start

Builtins
...
    . file
           The commands in the specified file are read and executed by the
           shell.

code snippet end

— man 1 dash

Попробовал экспериментально:

  • dash - работает, как описано в цитате с сайта ibm.
  • zsh - работает также
  • bash - сначала ищет файл в текущей директории
  • sh (bash в режиме совместимости sh) - как и bash, сначала ищет файл в текущей директории

Посмотрел ещё раз внимательно на пример из книги - а тут файл games находится в PATH, так что всё ожидаемо.


https://en.wikipedia.org/wiki/Dot_(command)