Чи є команда ./ (косою косою рисою)?


16

Основне питання:

Питання виникло, поки я не міг встановити програмне забезпечення, тому я щиро просив про ./ тому, що я не знав про це, і вихід "команда не знайдена" бентежить мене щодо того, що насправді була командою.

Контекст:

Я хотів би встановити файл truecrypt-7.2-setup-x86.

Інструкція говорить про використання команди:

sudo ./truecrypt-7.2-setup-x86

Але вихід:

sudo: ./truecrypt-7.2-setup-x86: command not found

ОНОВЛЕННЯ: для повноти, в тесті я був у папці файлів, але ще не зробив файл виконуваним (chmod + x).


1
./Частина команди говорить «Шукати в поточній директорії, і виконати команду" TrueCrypt-7.2-Setup-x86 "тут». Цю команду потрібно запустити з каталогу, де ви розпакували файл.
Чарльз Грін

2
@Videonauth - Не дуже, особисто я не думаю, що це піднімається до рівня відповіді.
Чарльз Грін

1
@Zanna Я перевірив сценарій без дозволів на виконання, і помилка, яку було видалено, була відсутньою помилкою дозволу, а не командою не знайдено.
Чарльз Грін

2
@ubuntubu Добре, дуже добре, ви перейшли в каталог - добре. Хоча невеликий коментар до редагування. Команда має бути chmod +x, chmod -xнавпаки - вона видаляє виконавчі дозволи
Сергій Колодяжний,

4
Назва запитання зовсім відрізняється від основної; можливо, це слід виправити?
David Z

Відповіді:


24

./не є командою. Команда є ./truecrypt-7.2-setup-x86.

Ваша оболонка та подібні програми sudoбудуть розглядати команду як ім'я шляху, коли вона містить хоча б один /символ. Оскільки .представляє каталог, у якому ви зараз перебуваєте,./truecrypt-7.2-setup-x86 називайте файл truecrypt-7.2-setup-x86у поточному каталозі. Якщо такого файлу немає або є, але файл неможливо запустити, ви отримаєте повідомлення про помилку.

Якщо команда не містить косу рису, в ній переглядаються каталоги, перераховані в $PATHній, як каже Сергій Колодяжний . Поточний каталог НЕ автоматичний пошук - і це НЕ рекомендується ставити .в $PATH. Таким чином, ви випадково не запускаєте речі, яких ви не очікували виконувати, тому що у вас трапилосяcd d до каталогу, який їх містить.

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

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


21

Частина команди ./ говорить "Подивіться у поточній директорії та виконайте команду 'truecrypt-7.2-setup-x86' звідси". Цю команду потрібно запустити з каталогу, де ви розпакували файл.

Це можна перевірити: у тому ж вікні терміналу, де ви намагаєтеся виконати команду, введіть команду ls -l true* - якщо файл присутній у поточному робочому каталозі, тоді буде відображено список із зазначенням файлу (та купою додаткової інформації).

Як зауважила Занна в коментарях, ваш файл може не мати дозволів на виконання - це можна легко виправити. Як тестовий випадок показаний мій каталог

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

і файл "rFullBack" відображає "-rw-" як мій дозвіл, щоб прочитати та записати файл. Я можу виконати команду, chmod +x rFullBackі каталог, в якому перелік змін, змінюється

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

Там мої дозволи тепер '-rwx', що вказує на те, що я можу виконати файл.


Словом, якщо файл існує у вашому каталозі

запустити команду

chmod +x ./truecrypt-7.2-setup-x86

а потім команда

sudo ./truecrypt-7.2-setup-x86

1
Не зовсім. У ньому вказано rw-ваш дозвіл - -раніше, ніж це встановлено [gu] id та липкі біти.
Duncan X Simpson

@DuncanXSimpson Спасибі - я трохи оновив опис дозволів, але я буду ігнорувати встановлений та клейкі біти для цієї відповіді!
Чарльз Грін

8

Як працюють команди виклику в оболонці

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

Що станеться, якщо команда, яку ви хочете запустити, знаходиться в тому самому каталозі, який ви знаходитесь в даний момент, але цей каталог не знаходиться в списку PATHкаталогів? Ось тоді потрібно використовувати ./. Це таким же чином, як робити/bin/bash ви - ви повідомляєте оболонці, де знаходиться бажана команда, повний шлях до неї. А у випадку ./ ви говорите на оболонку "подивіться в цей каталог". Настільки важливою частиною є те, що ви повинні знаходитись у тому самому каталозі, де знаходиться файл.

Звичайно, для того, щоб реально запустити виконуваний файл, він повинен мати встановлений виконуваний біт, тому вам потрібно буде chmod +x ./my_file.

Тож важливі кроки:

  1. cd де ви зберегли файл; якщо це в ~/Downloads, тоcd ~/Downloads
  2. Виконати chmod +x ./truecrypt-7.2-setup-x86, це говорить "зробіть файл truecrypt-7.2-setup-x86, який є в цьому каталозі виконуваним"
  3. А тепер зробіть sudo ./truecrypt-7.2-setup-x86

Зауважте, що використання ./не є випадковою поведінкою, але насправді є стандартом, визначеним стандартом інтерфейсу портативної операційної системи (він же POSIX) , зокрема див. Розділ «Пошук і виконання команд».

Повтор помилки

$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh                         
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not  sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/                                                                                                                                                      
$ sudo ./my_script.sh                                                                                                                                                  
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found

ПРИМІТКА . Повідомлення про помилку, яке подається, sudoочевидно, вводить в оману, тому це слід пам’ятати; однак зауважте, що це не було ядром питання, яке задає ОП.

Документація та довідки

З bash4.3 посібника, розділ "КОМАНДА ВИКОНАННЯ":

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

З Чому для запуску цього файлу в bash потрібен ./ (точкою косою рисою) перед назвою сценарію? :

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


Фактично sudoвихід вводить в оману. Якщо ви намагаєтеся ж без sudo, ви отримаєте іншу помилку з bash: Permission denied. І це правильно, оскільки ви не дали дозволу на виконання сценарію (через chmod +x).
Руслан

@Ruslan той факт, що sudoвихід вводить в оману, є правдою, але ця помилка виявляється. Про це можна повідомити розробникам і дозволити їх виправити. Однак це не є основою дискусії - нам потрібно було встановити, що зробила ОП, щоб створити таку помилку, і направити їх на правильний шлях. Чи вводить це в оману чи ні - це не в цьому питання.
Сергій Колодяжний

По-іншому, це не зовсім так, як використовувати /bin/bash: Це не дозволяє виконувати скрипт, на який у вас немає дозволу на виконання. Коли ви передручаєте ім'я скрипта , важливим є /bin/bashфакт, що /bin/bashвиконується, оскільки це команда, що виконується. Якщо цього не робити, сам сценарій виконується, що, в свою чергу, призводить до того, що ви звертаєтесь до вашої поточної оболонки або до того, #!що викликається у верхньому рядку
Monty Harder

@MontyHarder /bin/bash- це лише приклад. Те, що ми телефонуємо, /bin/bashі ./script.sh вказуючи шлях до того, що виконується, - це те саме. Настроковий сценарій з bash script.shабо зовсім іншою темою, де ви запускаєте виконуваний файл і /bin/bash script.shпередаєте йому скрипт як аргумент - який, до речі, може зламатися, якщо, наприклад, синтаксис записаний для чогось іншого, ніж оболонки, яку ви викликаєте . виконується добре, але факт полягає в тому, що ви все ще вказуєте повний шлях до нього. csh/bin/bash
Сергій Колодяжний

2
@SergiyKolodyazhnyy Попередження назви сценарію з /bin/bashабо навіть просто bashє також поширеним способом вирішити відсутність дозволів на виконання сценарію. Вказання повного шляху скрипта не вирішує цю проблему. Це /bin/bashє особливо поганим прикладом у цьому конкретному випадку.
Monty Harder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.