Чому я повинен вводити "./" завжди перед виконаним файлом, щоб виконати його в Linux?


8

Коли я компілюю egxc:

GCC x.c -o x

Для виконання результату я повинен написати:

./x

І просто набравши:

x

Помилка цього повідомлення:

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

Це означає, що Linux не шукає для цього поточний каталог! Чи є (я впевнений, що є) якийсь розумний питання, що стоїть за такою поведінкою?


Тому що це правила.
Даніель Р Хікс

@DanH: Тоді поясніть, будь ласка, "правила".
Torben Gundtofte-Bruun

Відповіді:


13

Тому що за замовчуванням поточна робоча директорія не знаходиться в PATHзмінній.

Це міра безпеки / зручності. Якщо у вашому поточному робочому каталозі є бінарні файли / скрипти, які називаються, наприклад cd, lsтощо, було б дуже прикро, якби вони працювали за замовчуванням.


4
Відповідь лише частково правильна. Проблему можна усунути, якщо поточний каталог використовувався лише як останній варіант. Тоді стандартні інструменти все-таки знайдуться спочатку.
користувач невідомий

1
Крім того , оболонка приймати precendence вбудованих функцій (наприклад , при введенні cdв bash, він виконує звичайну внутрішній бити і не /bin/cd) , якщо ви не випереджати з `.`
LawrenceC

3
Один з оригінальних заходів безпеки * nix, він змушує виконувати компільований бінарними файлами системи або адміністратора, які знаходяться в призначеній системі команді шляху. Нічого такого поганого, як хтось увійти як root на запитання служби довідки, перейдіть до каталогу користувачів, введіть ls і знайдіть, що він завантажив бомбу, залишену користувачем.
Лабораторії Фіаско

7
@userunknown: І коли ви ввели друк sl, у вас з’явилася та сама проблема. Тільки довірені каталоги повинні бути $PATHі відносні шляхи люблять .НЕ ніколи довірений каталог для інтерактивної оболонки.

2
@Basic: Якщо я набираю текст, rm -r targetколи я мав на увазі rm -f target, зазвичай немає різниці. Якщо я rm -f targetмаю на увазі rm -r target, коли я мав на увазі , то різниці немає, або видалення відмовляється. Крім того, я думаю, що кожен раз перед тим, як набрати rm, особливо якщо я додаю -fабо -rглобус - це небезпечна команда за своєю природою. Ніхто не думає перед lsінж.

1

Це означає, що поточний каталог не знаходиться в змінній $ PATH.


1

Ви можете виправити це, додавши поточну директорію (представлену однією крапкою) до PATHзмінної середовища.
Спосіб зробити це залежить від оболонки, яку ви використовуєте.
якщо ви використовуєте bash, ви можете додати рядок export PATH=$PATH:.до .bashrcфайлу у вашому домашньому каталозі.
якщо ви використовуєте csh або tcsh, додайте рядок set PATH = ($PATH .)до файлу .cshrc у своєму домашньому каталозі.
IMHO, для домашнього настільного комп'ютера це прийнятна річ - безпека розумна.


Я не знав, що ми можемо додати. але PATH, однак, це знизить безпеку, правда?
Ясер Замані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.