Я использовал Linux & Mac для когда-то теперь, и я всегда задаюсь вопросом - Почему мы должны выполнить программу как ./progname
. Я знаю, что Unix рассматривает каждую вещь как файл, и это хранит имя файла в таблице, которая указывает на inode число файла.
Но как abc.py
отличающийся от ./abc.py
?
./abc.py
означает, "Выполняются abc.py
файл, который находится в текущем каталоге."
abc.py
означает, "Выполняются что abc.py
файл Вы находите сначала в пути поиска каталога оболочки."
abc.py
должен быть в пути поиска команды (т.е. в одном из каталогов, указанных в PATH
переменная среды). ./abc.py
точный тракт: это выполняется abc.py
из текущего каталога (.
).
В мире Unix это считают плохой практикой, чтобы иметь текущий каталог в пути, так как это допускает чрезвычайно простые вредоносные атаки, где хорошо помещенный исполняемый файл, именованный после общей команды Unix (или общих орфографических ошибок этого), был бы непреднамеренно выполнен не подозревающим пользователем.
Например, довольно невероятное, но большая часть примера иллюстрирования является этим, где взломщик мог оставить исполняемый файл названным rm
в /tmp
и ожидайте системного администратора, чтобы попытаться опустеть /tmp
каталог.
ОС ищет программу для выполнения во всех каталогах, перечисленных в $PATH-variable. Локальный каталог ". /" обычно не находится в ПУТИ. Можно добавить его, но это имеет последствия безопасности.
Если Вы добавляете ". /" к Вашему ПУТИ, кто-то может поместить программу, названную "vi" в каталоге, и ожидать, пока кто-то не пытается отредактировать что-то в этом каталоге с vi - и программа выполнена с полномочиями пользователя, который просто был обманут... В однопользовательской системе это не могло бы быть серьезной проблемой, но это - все еще плохая практика.
Только необходимо сделать./abc.py если. не находится в Вашем $path. $path является переменной среды, которая говорит Вашу оболочку, где искать программы, когда Вы вводите их как команды. Вы могли использовать другую оболочку, которая имеет определенные встроенные местоположения, если Вы хотели.