Почему мы используем “. /” для выполнения файла?

В течение долгого времени 'набор портов FreeBSD', что означает программное обеспечение, доступное для него через его диспетчер пакетов, был больше и лучше, чем, что было в репозиториях Linux. Я предположил бы, что это не верно теперь, хотя я не знаю ни о какой статистике.

86
30.11.2010, 14:37
5 ответов

В Linux, UNIX и связанных операционных системах, . обозначает текущий каталог. Так как Вы хотите петлять в своем текущем каталоге, и тот каталог не находится в Вашем $PATH, Вам нужно ./ бит для сообщения оболочки, где исполняемый файл. Так, ./foo средства выполняют названный исполняемый файл foo это находится в этом каталоге.

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

78
27.01.2020, 19:30
  • 1
    Очень распространено выполнить программы в текущем каталоге. Почему оболочка не ищет там также? Это сначала ищет в., затем в $PATH. –  Michael 10.07.2013, 01:14
  • 2
    там также aliases, который может помешать, не просто $PATH . –  user2485710 15.10.2014, 00:35
  • 3
    @Michael и исправность: Если это искало в . сначала затем это была бы проблема безопасности, Вы, или кто-то еще мог заменить ls например (простой virus/trojen: сделайте zip-файл с исполняемым файлом названным ls в нем, поскольку кто-то перерывает, они выполняют этот исполняемый файл, это …). Если это искало в . в последний раз затем можно провести долгое время, сходя с ума не знающий, почему программа не работает (например, Вы делаете программу названной тестом, вместо того, чтобы запустить Вашу программу, это выполняет системную тестовую программу. Который не производит вывода). –  ctrl-alt-delor 14.03.2015, 20:24
  • 4
    Это также гарантирует что, если приложение или сценарий появляются многократно в Вашем пути, что Вы выполняете версию, которую Вы намереваетесь выполнить (тот прямо здесь в Вашем "." каталоге). gtk-сообщение –  Jim2B 07.07.2015, 21:43
  • 5
    , который можно выполнить export PATH="$PATH:." для выполнения команды в текущем каталоге, если не найденный в другом месте в ПУТИ можно добавить это в .bashrc файле –  jcubic 23.04.2017, 13:01

Литеральный ответ - поскольку другие дали: потому что текущий каталог не находится в Вашем $PATH.

Но почему? Короче говоря, это для безопасности. Если Вы смотрите в чужом корневом каталоге (или/tmp) и вводите просто gcc или ls, Вы хотите знать о выполнении реального не злонамеренная версия друг шутника записал, который стирает все файлы. Другой пример был бы test или [, который мог бы переопределить те команды в сценариях оболочки, если Ваша оболочка не имеет их, как создано-ins.

Наличие . поскольку последняя запись в Вашем пути немного более безопасна, но существуют другие нападения, которые используют это. Легкий должен использовать общие опечатки, как sl или ls-l. Или, найдите общую команду, которая, оказывается, не установлена в этой системе — vim, например, так как системные администраторы имеют необычную вероятность для ввода этого.

100
27.01.2020, 19:30

Если Вы имеете в виду, почему Вам нужен./в запуске - поэтому (в отличие от этого, в 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
45
27.01.2020, 19:30
  • 1
    Спасибо. Мое сомнение состоит в том, почему Вам нужен./в запуске.... Я получил использование "." (к poit текущий каталог), но почему "/" после этого? –  Renjith G 30.11.2010, 10:35
  • 2
    /является разделителем пути в Linux, таким образом, Вы используете его для разделения каталога (.) от имени файла (a.out). Без него у Вас есть .a.out, который является допустимым именем файла самостоятельно. (Попробуйте touch .a.out; ls -lA видеть это.) –  Simon Whitaker 30.11.2010, 10:37
  • 3
    , именно так Вы указываете путь в Unix, <dir>/<file> таким образом, как Вы в основном говорите, выполняют файл в текущем каталоге, который обозначается ./test –  Rohan Monga 30.11.2010, 10:37
  • 4
    , именно так Вы указываете путь в Unix, <dir>/<file> таким образом, как Вы в основном говорите, выполняют файл в текущем каталоге, который обозначается ./test ---------121 релиз 9 Linux (Сорокопут) ядро--------8293----Red Hat 2.4.20-8 на i686 [renjithg@cvsserver renjithg] $ касается .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 30.11.2010, 10:48
  • 5
    Red Hat 9? Время для обновления! –  mattdm 17.02.2011, 03:53

Можно попытаться добавить :. к Вашей переменной $PATH.

Попытка ALT+F2 и тип: gksudo gedit /etc/environment при выполнении Linux/GTK (это - то, что Вы имеете при использовании Ubuntu).

ОДНАКО я настоятельно рекомендую Вам НЕ делать это. Это плохо плохо плохой и плохой.

Вы знаете, такие вещи работа как это с 1970. Существует причина, почему текущий каталог не включен в $PATH.

. текущий каталог

.something был бы скрытый файл (Тип "ALT +", чтобы заставить их появиться в Наутилусе или попытке"ls -la".

./someProgram.sh то, что Вы вводите для ВЫПОЛНЕНИЯ исполняемого файла someProgram.sh в текущем каталоге.

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

4
27.01.2020, 19:30

Я читаю руководства по Linux с 1999 года, и ни один из аргументов безопасности не имеет смысла. Настоящая причина в том, что Linux позволяет выполнять любой файл с любым расширением. Вся причина, по которой у вас есть расширения, заключается в том, чтобы избежать случайного нажатия на любой файл или вызова любого файла.

В Windows у вас есть exe, bats, на которые любой пользователь знает, что нельзя нажимать, если только он не поставил их туда сам или не написал программу. Задача решена. Тем не менее, теперь есть идиотское предупреждение о том, что вы используете exe. Хороший брандмауэр приложений допускает правила для запуска новых ненадежных приложений, а также определяет, в какие папки он может записывать данные.

Не знаю, откуда у большинства людей такое представление о безопасности.

  1. Мне нужно увидеть расширение.
  2. запустите брандмауэр приложения (Я не говорю об интернет- или сетевом брандмауэре ), который намного лучше, чем разрешения, или, по крайней мере, должен быть на верхнем уровне.
-3
21.08.2021, 22:48

Теги

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