Выполнить скомпилированный исполняемый файл C без ./ [duplicate]

Это просто означает, что либо alter > ncol( reach_mat ), либо i > nrow( reach_mat ), другими словами, ваши индексы превышают границу массива (i больше числа строк или alter больше, чем количество столбцов).

Просто запустите указанные выше тесты, чтобы узнать, что и когда происходит.

232
задан Charles Duffy 31 January 2018 в 22:07
поделиться

9 ответов

Поскольку в Unix, как правило, текущий каталог не находится в $PATH.

Когда вы вводите команду, оболочка просматривает список каталогов, как указано переменной PATH. Текущий каталог отсутствует в этом списке.

Причиной отсутствия текущего каталога в этом списке является безопасность.

Допустим, вы root и переходите в каталог другого пользователя и тип sl вместо ls. Если текущий каталог находится в PATH, оболочка попытается выполнить программу sl в этом каталоге (так как нет другой программы sl). Эта программа sl может быть злонамеренной.

Она работает с ./, потому что POSIX указывает , что имя команды, которое содержит /, будет использоваться как имя файла напрямую, подавление поиска в $PATH. Вы могли бы использовать полный путь для того же самого эффекта, но ./ короче и легче писать.

EDIT

Эта часть sl была просто примером. Каталоги в PATH обыскиваются последовательно и когда выполняется совпадение с выполнением этой программы. Таким образом, в зависимости от того, как выглядит PATH, типичная команда может или не может быть достаточной для запуска программы в текущем каталоге.

232
ответ дан that other guy 16 August 2018 в 05:28
поделиться
  • 1
    Вам не нужно ничего вводить в заблуждение. Пользователь может просто загрузить вредоносный пакет, содержащий в нем исполняемый файл ls. – Juliano 13 June 2011 в 14:34
  • 2
    Всего лишь примечание для всех, говорящее, что это только в Unix, а не в Windows, это то же самое в Powershell - вам нужно сделать .\my.bat и т. Д. Для выполнения – manojlds 13 June 2011 в 23:16
  • 3
    @gaearon ergh, я сказал, что «не является псевдонимом», когда это должно было быть «строго псевдоним». – Charles Duffy 14 June 2011 в 00:46
  • 4
    Это было очень полезное объяснение. Еще 20 лет назад, когда я немного работал с DOS, я думаю, что CMD проверит текущий каталог, ТОГДА ПУТЬ, так что поведение Linux не было тем, что я ожидал, но это делает много смысла. – TecBrat 23 December 2013 в 16:37
  • 5
    @cnicutar: Интересно, что сегодня я обнаружил, что есть команда sl, называемая паровозом, хотя по умолчанию недоступна ;-) – blackSmith 11 September 2014 в 13:46

Существует разница между Current Directory и Working Directory, которую вы можете легко найти на google. Вот почему ваш manage.py syncdb не выполнит, как ожидалось.

Current Directory: это каталог, из которого выполняется ваш shell или родительский процесс.

you are right "."  is for current directory.

In UNIX, если у вас есть файл в /data/myfile.out, то вы переходите к своему файлу через имена компонентов, которые разделены forward slash "/", поэтому если "." является вашим текущим каталогом, то если вы хотите получить доступ (выполнить в вашем случае) файл, находящийся внутри вашего текущего каталога, вам нужно будет сказать ./myexecutableFile.o. Если у вас был исполняемый файл в другой папке вашего текущего каталога, вы бы сделали что-то вроде этого ./myFiles/myexecutableFile.o. Надеюсь, вы получили то, что я пытаюсь объяснить.

-5
ответ дан Amandeep Jiddewar 16 August 2018 в 05:28
поделиться

В * nix, в отличие от Windows, текущий каталог обычно не входит в вашу переменную $PATH. Таким образом, текущий каталог не выполняется при выполнении команд. Вам не нужно ./ для запуска приложений, потому что эти приложения являются в вашем $ PATH; скорее всего, они находятся в /bin или /usr/bin.

1
ответ дан Anomie 16 August 2018 в 05:28
поделиться

Когда bash интерпретирует командную строку, он ищет команды в местах, описанных в переменной среды $PATH. Чтобы увидеть его, введите:

echo $PATH

У вас будет несколько путей, разделенных двоеточиями. Как вы увидите, текущий путь . обычно не находится в $PATH. Поэтому Bash не может найти вашу команду, если она находится в текущем каталоге. Вы можете изменить его, если:

PATH=$PATH:.

Эта строка добавляет текущий каталог в $PATH, чтобы вы могли:

manage.py syncdb

Не рекомендуется, поскольку у него есть безопасность проблема, плюс вы можете иметь странное поведение, так как . зависит от того, в каком каталоге вы находитесь:)

Избегайте:

PATH=.:$PATH

Как вы можете «замаскировать» какую-то стандартную команду и откройте дверь для нарушения безопасности :)

Только мои два цента.

43
ответ дан ashwani 16 August 2018 в 05:28
поделиться

Когда сценарий не находится в Пути, это необходимо для этого. Для получения дополнительной информации читайте http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

0
ответ дан Gayan Hewa 16 August 2018 в 05:28
поделиться
  • 1
    ... FYI, в #bash на irc.freenode.org, мы постоянно исправляем недоразумения, которые люди узнали из TLDP (в частности, Advanced Bash Guide). Таким образом, руководство людьми там ... может быть, не идеально. (Наша предпочтительная вводная документация - mywiki.wooledge.org/BashGuide ) – Charles Duffy 13 June 2011 в 14:42

У этого вопроса уже есть некоторые удивительные ответы, но я хотел добавить, что если ваш исполняемый файл находится в PATH, и вы получаете очень разные выходы, когда вы запускаете

./executable

в те, которые вы получаете если вы запустите

executable

(допустим, вы запускаете сообщения об ошибках с одним, а не другим), тогда проблема может заключаться в том, что на вашем компьютере есть две разные версии исполняемого файла: одна на путь, а другой нет.

Проверьте это, выполнив

, какой исполняемый файл

и

whereis executable

Он исправил мои проблемы ... У меня было три версии исполняемого файла, только один из которых был правильно скомпилирован для среды.

1
ответ дан KR_Henninger 16 August 2018 в 05:28
поделиться

Когда вы включаете '.' вы в основном предоставляете «полный путь» исполняемому скрипту bash, поэтому вашей оболочке не нужно проверять вашу переменную PATH. Без '.' ваша оболочка будет выглядеть в вашей переменной PATH (которую вы можете увидеть, запустив echo $PATH, чтобы увидеть, будет ли введенная вами команда живет в любой из папок вашего PATH. Если это не так (как в случае с manage.py) он говорит, что не может найти файл. Считается, что плохая практика включает текущий каталог на вашем PATH, который здесь объясняется достаточно хорошо: http://www.faqs.org/faqs/unix-faq/ чаво / часть2 / секция-13.html

4
ответ дан Mark Drago 16 August 2018 в 05:28
поделиться

Ваш скрипт, если в вашем домашнем каталоге не будет найден, когда оболочка увидит переменную среды $PATH, чтобы найти ваш скрипт.

./ говорит: «Посмотрите в текущем каталоге для мой сценарий, а не просмотр всех каталогов, указанных в $PATH '.

31
ответ дан mdm 16 August 2018 в 05:28
поделиться
-1
ответ дан Würgspaß 29 October 2018 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: