объясните команду 'printf — “#! $ {opt_E}”'

Условно, /opt используется для вручную установленных программ с сам содержавшие каталоги.

Программы в сам содержавшие каталоги не обнаружатся в Вашем ПУТИ по умолчанию, но обычно это решено путем создания символьных ссылок в /usr/local/bin к любым двоичным файлам под /opt.

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

Используя /opt и /usr/local избегает потенциальных конфликтов между вручную установленными файлами и файлами, установленными системой управления пакета (конфетка, склонная, и т.д. обычно устанавливайте файлы в /usr/bin, /usr/lib, и т.д.). Исторически, конфликты имели тенденцию приводить к тихо перезаписываемым файлам, вызывая все виды неожиданного поведения. Современные системы управления пакета лучше об этом, но все еще лучше не полагаться на автоматизированное разрешение конфликтов, которое может или не может всегда делать то, что Вы ожидаете.

1
21.01.2013, 11:44
2 ответа

См. справочник Bash:

!!:$

определяет последний аргумент предыдущей команды. Это может быть сокращено к! $.

Если это поведение нежелательно, можно просто выйти! с обратной косой чертой:

% echo "\!$"                  
!$
3
27.01.2020, 23:17

В сценарии, символах #! не являются особенными в этом контексте. Отрывок 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 на второй строке (вставляют его чуть ниже начальной буквы #! строка): оболочка распечатает трассировку каждой строки, поскольку она выполняет его.

2
27.01.2020, 23:17

Теги

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