Чому ми використовуємо "./" для виконання файлу?


84

Чому ми використовуємо ./filenameдля виконання файлу в Linux?

Чому б просто не увійти в нього , як і інші команди gcc, і lsт.д ...


Чи не буде перший рядок краще записаний як "Чому ми використовуємо ./command_nameдля виконання команди в Linux?"

Відповіді:


78

У Linux, UNIX та пов'язаних з ними операційних системах .позначає поточний каталог. Оскільки ви хочете запустити файл у вашому поточному каталозі, а цей каталог не знаходиться у вашому $PATH, вам потрібно, щоб ./біт повідомив оболонці, де знаходиться виконуваний файл. Отже, ./fooозначає запустити виконуваний файл, який називається fooу цьому каталозі.

Ви можете використовувати typeабо whichотримати повний шлях будь-яких команд, знайдених у вашому $PATH.


5
Дуже часто виконується виконання програм у поточному каталозі. Чому шкаралупа не шукає і там? Спочатку він шукає., Потім у $ PATH.
Майкл

Є також aliasес, які можуть перешкоджати не тільки $PATH.
користувач2485710

18
@Michael безпека та обґрунтованість: Якщо це було здійснено пошук .спочатку, це було б проблемою безпеки, ви або хтось інший можете замінити, lsнаприклад (простий вірус / trojen: зробити zip-файл із виконуваним ім’ям, названим lsу ньому, як хтось шукає , вони виконують цей виконуваний файл, що…). Якщо він шукав в .останньому, то ви можете витратити довгий час без розуму, не знаючи, чому ваша програма не працює (наприклад, ви робите програму під назвою тест, замість того, щоб запускати програму, вона запускає програму тестування систем. Що не дає результатів).
ctrl-alt-delor

Він також гарантує, що якщо додаток або скрипт з'являться кілька разів на вашому шляху, ви виконуєте версію, яку ви хочете запустити (ту, що знаходиться тут у вашому каталозі ".").
Jim2B

Ви можете виконати export PATH="$PATH:."команду для виконання в поточному каталозі, якщо її не знайти в іншому місці в PATH, ви можете додати це у свій .bashrc файл
jcubic

99

Буквальна відповідь така, як давали інші: тому що поточний каталог не у вашому $PATH.

Але чому? Словом, це для безпеки. Якщо ви шукаєте в чужому домашньому каталозі (або / tmp) і вводите просто gccабо ls, ви хочете знати, що ви працюєте зі справжньою, а не злісною версією, яку написав ваш друг пранкер, який видаляє всі ваші файли. Іншим прикладом може бути testабо [, що може змінити ці команди в скриптах оболонки, якщо у вашій оболонці немає таких як вбудовані.

Маючи в .якості останньої записи в вашому шляху трохи безпечніше, але є й інші атаки , які використовують це. Найпростішим є використання поширених помилок, як-от slабо ls-l. Або знайдіть загальну команду, яка не встановлена ​​в цій системі - vimнаприклад, оскільки системні адміністратори мають надмірну ймовірність ввести це.


5
Практичний приклад того, що хтось покусав цим: unix.stackexchange.com/questions/7767
mattdm

Просто мати абсолютні шляхи в PATHзмінному середовищі.
Ed Heal

45

Якщо ви маєте на увазі, навіщо вам ./ на початку - це тому, що (на відміну від Windows) поточний каталог за замовчуванням не є частиною вашого шляху. Якщо ви запускаєте:

$ ls

ваша оболонка шукає lsв каталогах змінної вашого середовища PATH ( echo $PATHщоб побачити її) та запускає перший виконуваний файл, який називається ls. Якщо ви введете:

$ a.out

оболонка зробить так само - але, ймовірно, не знайде виконуваний файл під назвою a.out. Вам потрібно сказати оболонці, де знаходиться a.out - це в поточному каталозі (.), Тоді шлях ./a.out.

Якщо ви запитуєте, чому його називають "a.out", це лише ім'я вихідного файлу за замовчуванням для gcc. Ви можете змінити його аргументом командного рядка -o. Наприклад:

$ gcc test.c -o test
$ ./test

Дякую. Мої сумніви, навіщо вам потрібно ./ на початку .... я отримав використання "". (щоб розмістити поточний каталог), але чому "/" після цього?
Renjith G

8
/ - це роздільник шляху в Linux, тому ви використовуєте його для відділення каталогу (.) від імені файлу (a.out). Без нього у вас є .a.out, який є власне правильним ім'ям файлу. (Спробуйте touch .a.out; ls -lAпереконатися в цьому.)
Саймон Уітакер

5
саме так ви вказуєте шлях в Unix, <dir>/<file>так що ви в основному говорите виконати файл у поточному каталозі, який позначається./test
Rohan Monga

Реліз Red Hat Linux 9 (Shrike) Kernel 2.4.20-8 на i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA всього 3 -rw-rw-r-- 1 renjithg renjithg 0 30 листопада 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 листопада 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 серпня 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9? Час оновлення!
mattdm

4

Ви можете спробувати додати :.до змінної $ PATH.

Спробуйте ALT + F2 і введіть: gksudo gedit /etc/environmentякщо працює Linux / GTK (це те, що ви маєте, якщо використовуєте Ubuntu).

ЯКЩО я настійно раджу НЕ робити цього. Це погано погано погано і погано.

Ви знаєте, такі речі працюють так з 1970 року. Є причина, чому поточний каталог не включений до $ PATH.

. - поточний каталог

.somethingбуде прихованим файлом (введіть "ALT +", щоб вони з'явилися в Nautilus, або спробуйте " ls -la".

./someProgram.sh це те, що ви вводите RUN виконуваного файлу someProgram.sh у поточному каталозі.

.somethingElse означатиме, що у вас є прихований виконуваний файл у поточному каталозі, що є поганою ідеєю.

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