Точка (.) в Шелл
В оболочке есть команда . (точка), которая исполняет команды в файле в текущей оболочке, а не в подоболочке. Изначально это было придумано для того, чтобы пользователю было удобно перезапускать свой .profile и не приходилось бы для этого выходить из системы и заново входить в нее, теперь же эта команда применяется и в других целях:
$ 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 $— 3.6. Переменные оболочки Программное окружение Unix (Керниган, Пайк)
Попробовал я создать простенький файл в текущей директории с командой echo.
$ echo 'echo hi' >ech
$ ls
ech
И исполнить его
$ . ech
dash: 33: .: ech: not found
Чзх?
Я использовал 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.
То есть, если путь до файла, который нужно исполнить не содержит косых черт - то оболочка ищет его в PATH. Если содержит косые черты (в моём случае ./ech) то будет исполнен этот файл.
Нашел описание этого поведения в posix-стандарте
А в руководстве dash об этом ни слова
Builtins ... . file The commands in the specified file are read and executed by the shell.— man 1 dash
Попробовал экспериментально:
- dash - работает, как описано в цитате с сайта ibm.
- zsh - работает также
- bash - сначала ищет файл в текущей директории
- sh (bash в режиме совместимости sh) - как и bash, сначала ищет файл в текущей директории
Посмотрел ещё раз внимательно на пример из книги - а тут файл games находится в PATH, так что всё ожидаемо.
https://en.wikipedia.org/wiki/Dot_(command)