Почему я всегда должен набирать «./» перед исполняемым файлом, чтобы запустить его в Linux?

8

Когда я компилирую egxc:

GCC x.c -o x

Чтобы выполнить результат я должен написать:

./x

И просто печатать:

x

Сбой с этим сообщением:

x: команда не найдена

Это означает, что Linux не ищет его в текущем каталоге! Есть ли (я уверен, что есть) какая-либо разумная проблема за этим поведением?

Ясир Замани
источник
Потому что это правила.
Даниэль Р Хикс
@DanH: Тогда объясни "правила", пожалуйста.
Торбен Гундтофте-Брюн

Ответы:

13

Потому что по умолчанию текущий рабочий каталог отсутствует в PATHпеременной.

Это мера безопасности / удобства. Если в вашем текущем рабочем каталоге есть исполняемые файлы / скрипты, называемые, например cd, lsи т. Д., Было бы очень неприятно, если бы они запускались по умолчанию.

Оливер Чарльзуорт
источник
4
Ответ только отчасти правильный. Проблема может быть окружена, если текущий каталог использовался только как последний вариант. Тогда стандартные инструменты все равно будут найдены первыми.
пользователь неизвестен
1
Кроме того , оболочка принимать precendence встроенных функций (например , при вводе cdв bash, он выполняет обычную внутренний колотить и не /bin/cd) , если вы не предварять с `.`
LawrenceC
3
Одна из первоначальных мер безопасности * nix, она заставляет скомпилированные системой или администратором двоичные файлы, которые находятся в назначенной системе команде path, выполняться. Ничего страшного, если кто-то войдет в систему как пользователь root с вопросом службы поддержки, зайдет в каталог пользователей, наберет ls и обнаружит, что он загрузил бомбу, оставленную пользователем.
Fiasco Labs
7
@userunknown: И в первый раз, когда вы опечатали sl, у вас та же проблема. Только доверенные каталоги должны быть $PATHи относительные пути любят .не никогда доверенный каталог для интерактивной оболочки.
2
@Basic: Если я пишу, rm -r targetкогда я имел в виду, rm -f targetобычно нет никакой разницы. Если я наберу, rm -f targetкогда я имел в виду rm -r target, либо нет никакой разницы, либо удаление не удастся. Кроме того, я думаю, что каждый раз, когда я печатаю rm, особенно если я добавляю -fили -rили глобус - это опасная команда по своей природе. Никто не думает, прежде чем lsING.
1

Это означает, что текущий каталог отсутствует в переменной $ PATH.

Джеймс
источник
1

Это можно исправить, добавив текущий каталог (представленный одной точкой) в PATHпеременную окружения.
Способ сделать это зависит от используемой вами оболочки.
если вы используете bash, вы можете добавить строку export PATH=$PATH:.в .bashrcфайл в вашем домашнем каталоге.
если вы используете csh или tcsh, добавьте строку set PATH = ($PATH .)в файл .cshrc в вашем домашнем каталоге.
ИМХО, для домашнего настольного компьютера это приемлемая вещь - с точки зрения безопасности.

kroiz
источник
Я не знал, что мы можем добавить. для PATH, однако, это уменьшит безопасность, верно?
Ясир Замани