Условно, /opt
используется для вручную установленных программ с сам содержавшие каталоги.
Программы в сам содержавшие каталоги не обнаружатся в Вашем ПУТИ по умолчанию, но обычно это решено путем создания символьных ссылок в /usr/local/bin
к любым двоичным файлам под /opt
.
Как подразумевается выше, /usr/local
другое местоположение для вручную установленных файлов, но оно обычно только используется для программ, которые разделяют их файлы (/usr/local/bin
для исполняемых файлов, /usr/local/lib
для библиотек, и т.д.).
Используя /opt
и /usr/local
избегает потенциальных конфликтов между вручную установленными файлами и файлами, установленными системой управления пакета (конфетка, склонная, и т.д. обычно устанавливайте файлы в /usr/bin
, /usr/lib
, и т.д.). Исторически, конфликты имели тенденцию приводить к тихо перезаписываемым файлам, вызывая все виды неожиданного поведения. Современные системы управления пакета лучше об этом, но все еще лучше не полагаться на автоматизированное разрешение конфликтов, которое может или не может всегда делать то, что Вы ожидаете.
См. справочник Bash:
!!:$
определяет последний аргумент предыдущей команды. Это может быть сокращено к! $.
Если это поведение нежелательно, можно просто выйти! с обратной косой чертой:
% echo "\!$"
!$
В сценарии, символах #!
не являются особенными в этом контексте. Отрывок printf -- "#!${opt_E}"
вызовы printf
команда с двумя аргументами: --
, и #!
связанный со значением opt_E
переменная. Аргумент --
говорит printf
это, даже если существует последующее начало аргументов -
, они не должны быть интерпретированы как опции; это не имеет значения здесь с тех пор #!${opt_E}
не начинается -
. Двойные кавычки вокруг #!${opt_E}
защитить #
от того, чтобы быть интерпретируемым как начальный символ комментария, и они защищают значение opt_E
от того, чтобы быть разделенным на отдельные слова, которые интерпретируются как подстановочные шаблоны.
Если значение opt_E
не содержит никого %
или \
символ, затем эта команда печать #!
сопровождаемый значением opt_E
, без заключительной новой строки. В целом команда интерпретирует значение opt_E
как printf формат.
При испытании этого в интерактивной оболочке можно видеть странные эффекты из-за !
будучи интерпретируемым как символ расширения истории, который автоматически повторно вызывает предыдущие команды. Для предотвращения этого добавьте a \
прежде !
. !
также интерпретируется буквально в одинарных кавычках: printf -- '#!${opt_E}'
.
При воспроизведении сценария Вы, должно быть, установили opt_E
к правильному значению сначала. При попытке отладить сценарий, добавить set -x
на второй строке (вставляют его чуть ниже начальной буквы #!
строка): оболочка распечатает трассировку каждой строки, поскольку она выполняет его.