Почему мы используем ./filename
для запуска файла в Linux?
Почему бы просто не ввести его, как другие команды gcc
и ls
т.д ...
command-line
executable
Renjith G
источник
источник
./command_name
для выполнения команды в Linux?»Ответы:
В Linux, UNIX и связанных операционных системах
.
обозначает текущий каталог. Поскольку вы хотите запустить файл в вашем текущем каталоге, а этот каталог не в вашем$PATH
, вам нужен./
бит, чтобы указать оболочке, где находится исполняемый файл. Итак,./foo
означает запустить исполняемый файл,foo
который находится в этом каталоге.Вы можете использовать
type
или,which
чтобы получить полный путь любых команд, найденных в вашем$PATH
.источник
alias
которые могут мешать, а не только$PATH
..
первым, то это будет проблема безопасности, которую вы или кто-то другой можете заменить,ls
например (простой вирус / троянский файл: создайте zip-файл с именем исполняемого файлаls
, когда кто-то просматривает , они запускают этот исполняемый файл, что ...). Если поиск производился в.
последний раз, вы можете потратить немало времени на то, чтобы не знать, почему ваша программа не работает (например, вы создаете программу под названием test, вместо того, чтобы запускать ее, она запускает программу системного тестирования.export PATH="$PATH:."
команду в текущем каталоге, если она не найдена в другом месте в PATH, вы можете добавить ее в свой файл .bashrcБуквальный ответ такой же, как и у других: текущий каталог не в вашем
$PATH
.Но почему? Короче говоря, это для безопасности. Если вы заглядываете в чей-то домашний каталог (или / tmp) и вводите просто
gcc
илиls
, вы хотите знать, что вы используете реальную, а не вредоносную версию, написанную вашим другом-шутником, которая стирает все ваши файлы. Другим примером может бытьtest
или[
, который может переопределить эти команды в сценариях оболочки, если ваша оболочка не имеет таких встроенных модулей.Имея в
.
качестве последней записи в вашем пути немного безопаснее, но есть и другие атаки , которые используют это. Легко использовать обычные опечатки, такие какsl
илиls-l
. Или найдите обычную команду, которая, как оказалось, не установлена в этой системе -vim
например, поскольку системные администраторы имеют вероятность набрать ее выше среднего.источник
PATH
переменной среды.Если вы имеете в виду, зачем вам нужно ./ в начале - потому что (в отличие от Windows) текущий каталог по умолчанию не является частью вашего пути. Если вы запускаете:
ваша оболочка ищет
ls
в каталогах переменную среды PATH (echo $PATH
чтобы увидеть ее) и запускает первый исполняемый файл,ls
который он находит. Если вы введете:оболочка будет работать аналогично - но, вероятно, не найдет исполняемый файл с именем a.out. Вы должны указать оболочке, где находится a.out - если он находится в текущем каталоге (.), То путь будет
./a.out
.Если вы спрашиваете, почему он называется «a.out», это просто имя выходного файла по умолчанию для gcc. Вы можете изменить его с помощью командной строки -o arg. Например:
источник
touch .a.out; ls -lA
это увидеть.)<dir>/<file>
так что вы в основном говорите «выполнить файл в текущем каталоге», что обозначено./test
Вы можете попытаться добавить
:.
к своей переменной $ PATH.Попробуйте ALT + F2 и наберите:
gksudo gedit /etc/environment
если вы используете Linux / GTK (это то, что вы имеете, если используете Ubuntu).ОДНАКО, я настоятельно советую вам НЕ делать этого. Это плохо, плохо, плохо и плохо.
Вы знаете, что такие вещи работают так с 1970 года. Есть причина, по которой текущий каталог не включен в $ PATH.
.
текущий каталог.something
будет скрытым файлом (введите «ALT +», чтобы они появились в Nautilus, или попробуйте «ls -la
»../someProgram.sh
это то, что вы вводите для запуска исполняемого файла someProgram.sh в текущем каталоге..somethingElse
будет означать, что у вас есть скрытый исполняемый файл в текущем каталоге, что является плохой идеей.источник