Зачем мне нужно вводить `. /` Перед выполнением программы в текущем каталоге?

Измените «кеш» (режим временных файлов) для virtio disk1 до NONE (по умолчанию)

1
задан 6 August 2015 в 21:48

9 ответов

Причина этого проста.

Предположим, что у вас есть команда с тем же именем, что и приложение в текущем каталоге. Затем запуск команды в оболочке вызовет ваше приложение вместо встроенной команды. Это будет проблемой безопасности, если ничего другого.

Чтобы потребовать, чтобы ./ использовался впереди, оболочка знает, что вы хотите выполнить приложение с заданным именем, а не встроенную команду с это имя.

24
ответ дан 24 May 2018 в 19:58
  • 1
    Спасибо, Джордж. Спасибо, имеет смысл (и я думаю, что я слышал несколько лет назад - на этот раз нужно придерживаться Linux достаточно долго, чтобы этот материал утонул) – Doug 16 December 2010 в 07:28
  • 2
    ваше объяснение вводит в заблуждение, существует разница между встроенными командами в оболочке и исполняемыми файлами, доступными через переменную PATH. На самом деле ваш ответ, чем больше я читаю, тем более неверно. – Ahmed Masud 25 September 2015 в 03:17

./ выполняет файлы, которые не находятся в вашем $PATH, скорее, он выполняет файл в текущем каталоге (или другом через ./home/stefano/script.sh). Теперь PATH - это переменная среды, которая содержит все места, где bash может искать исполняемые программы, не имея полного (абсолютного) пути к ним.

Это разделение необходимо, чтобы не запускать неправильный файл. То есть если у вас есть файл с именем ls в вашем домашнем каталоге, он не находится в вашем PATH, это не позволит bash запутать его с реальным ls. Переменная PATH также определяет порядок поиска:

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

Чтобы запустить файл, вам нужно будет установить исполняемый бит в разрешениях:

Когда вы запустите команду или программа попытается сделать exec syscall (специальный метод ядра, как запускаются программы), система ищет файл, просматривая все каталоги в вашем PATH. После того, как программа была найдена, даже если она находится в нескольких каталогах, поиск прерывается, и первый найден. Или вы можете установить разрешения, щелкнув правой кнопкой мыши файл и выбрав «Свойства»:

Теперь вы можете скопировать файл в любой из каталогов в PATH, чтобы посмотреть, какие из них находятся там - и они настроены для каждого пользователя - введите echo $PATH.

stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[d14 ] Если вы создаете исполняемый файл cat и переместите его на /usr/local/sbin, он запускается вместо правильного cat, который находится в /bin. Вы можете узнать, где находятся ваши файлы, используя type cat и whereis cat.

16
ответ дан 24 May 2018 в 19:58
  • 1
    Одно замечание: его вопрос, похоже, указывает на то, что он скомпилировал и связал что-то с gcc, который автоматически устанавливает бит выполнения. – Nathan Osman 16 December 2010 в 07:36

Зачем вам нужно вводить ./ перед выполнением программы?

В терминале, когда вы вводите имя приложения, скажем, gedit, терминал будет выглядеть в некоторых (предварительно определенные) каталоги, содержащие приложения (двоичные файлы приложений). Имена этих каталогов содержатся в переменной под названием PATH. Вы можете увидеть, что находится в этой переменной, выполнив echo $PATH. См. Эти каталоги, разделенные :? Это каталоги, в которые терминал будет искать поиск, если вы просто наберете gedit, nautilus или a.out. Как вы можете видеть, путь к вашей программе a.out отсутствует. Когда вы выполняете ./a.out, вы говорите терминалу «смотрите в текущем каталоге и запустите a.out и не смотрите в PATH.

Решение 1

Если вы не хотите каждый раз набирать ./, вам нужно добавить каталог a.out в $PATH. В следующих инструкциях я предполагаю, что путь к a.out это /path/to/programs/, но вы должны изменить его на свой фактический путь.

Просто добавьте следующую строку в конец файла ~/.pam_environment:
PATH DEFAULT=${PATH}:/path/to/programs
Источник: постоянные переменные среды Выйдите из системы и зайдите в систему Теперь вы сможете запускать a.out без ./ из любого каталога.

Если у вас есть другие программы в других каталогах, вы можете просто добавить их в указанную выше строку. 'd советую иметь один каталог под названием myPrograms, например, и поместить в него все ваши программы.

Решение 2

Примечание: измените userName на свое фактическое имя пользователя Ubuntu .

Что делать, если у вас есть другие программы, которые вы хотите запустить? И все они в разных папках? Ну, «более организованное» соло было бы создать папку под названием bin в вашем домашнем каталоге и добавить символические ссылки (ярлыки) в этой папке. Вот как:

Просто добавьте следующую строку в конец файла ~/.pam_environment:
PATH DEFAULT=${PATH}:/path/to/programs
Источник: постоянные переменные среды

Просто добавьте следующую строку в конец файла ~/.pam_environment:

Это создаст «символическую ссылку» (в основном, ярлык) вашей программы a.out в разделе bin. Выйдите из системы и войдите в систему. Теперь вы можете запустить a.out без ./ из любого каталога.

ln -s /path/to/programs/a.out /home/userName/bin

Примечание: измените userName на свое фактическое имя пользователя Ubuntu.

11
ответ дан 24 May 2018 в 19:58
  • 1
    Это удобный прием, если он используется экономно. С его помощью ваша система делает то, чего не ожидал бы кто-то другой. Кроме того, когда вы делаете резервные копии, необходимо обращать внимание на символические ссылки. По умолчанию , rsync не обрабатывает их вообще, поэтому при восстановлении их там нет. – Joe 18 July 2013 в 00:10

Как отметил Джордж в своем ответе, это поможет вам заметить, что вы выполняете файл в текущем рабочем каталоге (pwd).

Я помню, как давно задал этот вопрос моему старшему , он сказал, что я должен добавить . к моему пути, чтобы, когда я делаю a.out, он выглядит в текущем каталоге и выполняет это. В этом случае мне не нужно делать ./a.out.

Но лично я бы рекомендовал против него. Это никогда не случалось со мной, но если вы находитесь в чужой сетевой директории или что-то еще, и там существует вредоносный исполняемый файл с именем ls, то наличие . на вашем пути - очень плохая идея. Не то чтобы вы часто сталкивались с этой проблемой, просто говоря.

1
ответ дан 24 May 2018 в 19:58
  • 1
    хорошо, Стефано принял свой ответ, чтобы содержать эту информацию :) – Shrikant Sharat 16 December 2010 в 07:34
  • 2
    Я полностью согласен, не добавляя . к $PATH. Очень опасная идея. – Nathan Osman 16 December 2010 в 07:37

A './' имеет смысл, когда вы запускаете известную вам программу и, например, ваш собственный. Эта программа должна присутствовать в вашем текущем каталоге. A './' не имеет смысла, когда вы запускаете стандартную команду, которая находится где-то в $ PATH. Команда «command-to-run» сообщает вам, где команда запускается в $ PATH.

0
ответ дан 24 May 2018 в 19:58
$ gcc hello.c -o /path/to/someplace/hello

создаст исполняемый файл в определенном месте. Если это местоположение находится на вашем пути, вы сможете запустить файл. Вы можете создать сценарий, если хотите создать ярлык для действия «скомпилируйте этот исходный код с помощью gcc и поместите исполняемый файл в определенное место, которое находится на вашем пути»

Я бы предложил вам создать новый каталог называемый «testbin» или что-то в этом роде, и поместите его на свой путь, чтобы сохранить существующие каталоги путей.

0
ответ дан 24 May 2018 в 19:58

./ устраняет ненужный поиск пути. ./ принудительно выполнять поиск только в текущем каталоге. Если мы не дадим ./, то он будет искать различные пути, установленные в систему, такие как /usr/bin, /usr/sbin/ и т. Д.

0
ответ дан 24 May 2018 в 19:58

"./" означает, что вы хотите выполнить файл в текущем каталоге, например, ярлык для ввода всего пути:

[root@server ~]#/path/to/file/file.pl

такой же, как:

[root@server file]#./file.pl

в предыдущем примере вы просмотрели каталог и его вспомогательные каталоги в расположение файла и использовали «./» для запуска файла в текущем каталоге.

тот, который перед ним »[root @server ~] # / path / to / file / file.pl "также выполнит файл, если вы ленитесь на" cd "свой путь к расположению файла.

0
ответ дан 24 May 2018 в 19:58

Это очень просто и имеет много применений.

Если установлено несколько версий одного и того же приложения, оно будет доступно по другому пути, но в /usr/bin может быть создана мягкая ссылка на ваш двоичный файл. Например, Python 2.7, Python 2.6 установлен, но / usr / bin / python -> python2.7 / usr / local / bin / python -> python2.6

Если вы находитесь на пути и выполняет Python, он всегда будет выполнять Python 2.7. При указании . будет выполняться исполняемый файл текущей папки.

Если установлено несколько версий одного приложения, оно будет доступно по другому пути, но в /usr/bin можно создать мягкую ссылку на ваш двоичный файл. Например, Python 2.7, Python 2.6 установлен, но / usr / bin / python -> python2.7 / usr / local / bin / python -> python2.6
-4
ответ дан 24 May 2018 в 19:58

Другие вопросы по тегам:

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