Яка різниця між запуском виконуваного файлу просто за назвою та додаванням крапки / косої риски перед ним?


13

Це вихід з ls -allкоманди:

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

Тепер, коли я просто запускаю, jdevвін запускає іншу версію Oracle JDveloper, ніж коли я запускаю її як .. ./jdevЧому це так?

Відповіді:


20

Коли ви запускаєте виконуваний файл (а точніше у світі unix / linux - файл із виконаними правами / прапором):

$ ./jdev

потім ви позначаєте, .що хочете запустити файл у вашій робочій каталозі (директорії, в якій ви зараз перебуваєте), який названий jdevі має права на виконання для користувача, який його запускає (ви повинні зауважити, що він все ще може бути посиланням на інший файл, ви можете перевірити це, ввівши ls -l jdevтермінал)

(див. дозволи файлів у linux / unix )

Коли ви запускаєте його як

$ jdev

то, швидше за все, він jdevінстальований десь у системі, і у вас він є $PATH(наприклад, /usr/bin/або /bin/або /usr/local/bin/)

Як зазначається peterph : ви можете використовувати whichдля вказівки на виконуваний файл, який запускається за допомогою певної команди, наприклад:

$ which find
/usr/bin/find

1
Також не те, що whichутиліта може сказати вам, який виконуваний файл буде використовуватися, якщо шлях не задано.
петерф

@peterph Редагував мою відповідь.
Патрик

7
Набагато краще використовувати typeдля перевірки того, що запускається певною командою. Тому що вам whichбуде показано лише бінарний файл десь у $ PATH, однак він може бути псевдонім абсолютно іншим бінарним.
пік

@rush Я тільки спробував це , і це не робота буде , як ви говорите: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. Покиzsoelim -> soelim
Патрик

2
@Patryk Я думаю, що "пік" означав псевдоніми / функції оболонки, які whichне мають шансів знайти, оскільки це окремий двійковий файл, який не має доступу до запущеного середовища оболонки (під яким я маю на увазі псевдоніми та функції, а не лише змінні середовища , частина з яких успадковується).
петерф

8

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

Якщо в імені є коса коса риса, то цього не відбувається, це ім'я береться за шлях виконання команди (хоча деякі оболонки, як-от zshдозволяють псевдонімам або функціям, в своєму імені мають косу рису, яка б тоді мала перевагу).

Отже, якщо ви хочете запустити команду, яка називається fooу поточному робочому каталозі, вам потрібно придумати ім’я, яке містить косу рису. ./fooє найбільш очевидним. Ви також можете використовувати повний шлях, або ../dir/foo...

Щоб знати, чим би виконувалась оболонка, скористайтеся typeкомандою. Не використовуйте whichкоманду, яка, як правило, не робить те, що ви думаєте, що це робить, і є спадщиною, від cshякої краще залишитись у спокої.


Чому б не "який", а "тип"?
Geek

@Geek, ось питання тут, дивіться unix.stackexchange.com/search?q= evidencewhichgery+type
Stéphane Chazelas

Ви надали правильне посилання?
Geek

Це результат пошуку на цьому веб-сайті, який підтверджує, що це часто задаване питання. Багато відповідей на ці запитання підкажуть, чому не користуватися which. Дивіться, наприклад, unix.stackexchange.com/questions/16693/…
Stéphane Chazelas

2

Я рекомендую використовувати вбудований Zsh "де" (краще, ніж "який"), щоб побачити, як і в якому порядку будуть знайдені псевдоніми, вбудовані оболонки або що-небудь інше, щоб $ PATH ;-)

Ось приклад, щоб краще зрозуміти речі, як їх вибрати:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

1

Хоча це, мабуть, залежить від вашої оболонки, правило:

  • Якщо ви вказали шлях, відносний чи абсолютний, цей шлях буде використаний. ./jdevє відносним шляхом, тому що .стоїть на поточному каталозі (насправді, ls -all .це дасть вам те саме, що ls -all). Якщо ви робите /usr/bin/tool/, ви використовуєте абсолютний шлях. У цих випадках виконується файл, на який вказується.

  • Якщо ви не вкажете шлях, а лише ім'я, в $PATHпошукових каталогах шукається інструмент, який ви намагаєтеся запустити.

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

Можливо, інша проблема полягає в тому, що ви насправді очікували jdevзапустити виконуваний файл у поточному каталозі. Якщо ви не змінили $PATHдля включення ., це зовсім не те, чого слід очікувати ...

... і включити .туди все ще не дуже гарна ідея , якщо ви це зробите, будь-ласка, принаймні поставте її в кінці, щоб решту $PATHзавжди шукали спочатку - просто уявіть, що ви перебуваєте у спільному мережевому каталозі та хтось вирішить поставити туди злий бінар, оскільки ls, якщо $PATHпочинається з ., ls -lahдля атаки на вашу систему буде достатньо простого .


Ваша термінологія заплутана. jdevпоодинці - це також відносний шлях. Правило таке: якщо він не містить косу рису, то його шукають у псевдонімах, функціях і $PATH, в іншому випадку, він шукається безпосередньо у файловій системі (хоча деякі оболонки дозволяють псевдоніми або функції з / в їх імені, які потім братимуть прецедент).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.