Какой смысл добавлять "." (точка )в переменной пути?

awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file

Это использует awkдля разбора файла как строк, состоящих из полей, разделенных запятыми -.

Код определяет, когда в строке имеется более одного поля, и когда это так, первое поле заменяется вторым полем. Затем печатается первое поле, либо неизмененное, либо модифицированное условным кодом.

2
22.10.2019, 13:46
2 ответа

Добавление .к пути означает, что исполняемые файлы в текущем каталоге рассматриваются оболочкой, в результате чего вам больше не нужно вводить ./в качестве префикса . В вашем случае, поскольку это последняя запись, такие команды будут выполняться только в том случае, если перед этим ничего не совпадает; так, например, lsпо-прежнему будет работать /bin/ls.

Есть несколько причин, по которым это обычно не рекомендуется (см. ссылку выше):

  • это может быть плохо для безопасности, так как кто-то может оставить двоичный файл в каталоге, который вы обычно посещаете, и надеяться, что вы запустите его случайно — хотя это менее рискованно с .в качестве последней записи, а не первый;
  • запуск команды в текущем каталоге без ./означает, что будет использована первая совпадающая команда в пути, не обязательно та, которая находится в текущем каталоге.
6
28.04.2021, 23:28

Немного предыстории :Переменная окружения PATH представляет собой список каталогов, разделенных двоеточиями. Когда вы вводите имя команды, не указывая явный путь (, например. вы набираете «ls», а не «/bin/ls» )ваша оболочка ищет все каталоги в списке PATH по порядку, ища исполняемый файл с таким именем, и оболочка запускает первую подходящую программу, которую находит.

Один из каталогов в списке PATH может быть текущим каталогом ".". Также допустимо использовать пустое имя каталога в списке PATH для указания текущего каталога. Оба они эквивалентны

для пользователей csh:

    setenv PATH :/usr/ucb:/bin:/usr/bin
    setenv PATH.:/usr/ucb:/bin:/usr/bin

для пользователей sh или ksh

    PATH=:/usr/ucb:/bin:/usr/bin export PATH
    PATH=.:/usr/ucb:/bin:/usr/bin export PATH

Наличие "." где-то в PATH удобно -вы можете ввести «a.out» вместо «./a.out», чтобы запускать программы в текущем каталоге. Но есть одна загвоздка.

Рассмотрим, что происходит в случае, когда "." является первой записью в PATH. Предположим, что ваш текущий каталог является публично -доступным для записи, например, "/tmp". Если там просто окажется программа с именем «/tmp/ls», оставленная каким-то другим пользователем, и вы наберете «ls» (, намереваясь, конечно, запустить обычную программу «/bin/ls» ), ваша оболочка вместо этого запустит "./ls", программу другого пользователя. Излишне говорить, что результаты запуска такой неизвестной программы могут вас удивить.

Немного лучше иметь "." в конце ПУТИ:

    setenv PATH /usr/ucb:/bin:/usr/bin:.

Теперь, если вы находитесь в /tmp и набираете «ls», оболочка будет искать в /usr/ucb, /bin и /usr/bin программу с именем «ls», прежде чем найдет время для поиска в «. ", и снижается риск непреднамеренного запуска программы "ls" другого пользователя. Однако это не на 100% безопасно -, если вы неуклюжий машинист и когда-нибудь наберете «sl -l» вместо «ls -l», вы рискуете запустить «./sl», если он есть.Какой-нибудь «умный» программист мог бы предвидеть типичные ошибки при наборе текста и оставить программы с такими именами разбросанными по общедоступным каталогам. Остерегаться.

Многие опытные пользователи Unix прекрасно обходятся без "." вообще в PATH:

    setenv PATH /usr/ucb:/bin:/usr/bin

Если вы сделаете это, вам нужно будет ввести «./program» вместо «program», чтобы запускать программы в текущем каталоге, но повышение безопасности, вероятно, того стоит.

1
28.04.2021, 23:28

Теги

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