Есть ли гарантия, что / usr / bin / env будет существовать?

8

Часто я вижу, что сценарии начинаются со строки shebang, которая используется #!/usr/bin/env interpreter_nameдля любого интерпретатора, с обоснованием того, что разные системы могут иметь интерпретатор, который им нужен для запуска, установленного в разных местах. Например, если я предполагаю, pythonчто установлен так, как /usr/bin/pythonнекоторые пользователи, которые решили установить его, /opt/pythonпо какой-то причине не смогут использовать его так же легко.

Но очевидный вопрос заключается в том, есть ли какая-либо гарантия, которая envбудет установлена ​​в /usr/bin/env(или, если уж на то пошло, в каком-то конкретном месте), или это, так сказать, «случай решения проблемы»?

В этом слегка связанном вопросе есть комментарий, в котором говорится, что это плохая идея, и желательно установить его с фактическим путем интерпретатора, и он ссылается на единственную спецификацию unix, но на самом деле не решает этот вопрос.

scott_fakename
источник

Ответы:

6

Нет, envгарантированно не будет /usr/bin, как вы можете прочитать в истории механизма Шебанга , в разделе «Утилита env»:

Однако расположение env (1) может отличаться. Free-, Net-, OpenBSD и некоторые дистрибутивы Linux (например, Debian) поставляются только с / usr / bin / env. С другой стороны, есть только / bin / env по крайней мере в SCO OpenServer 5.0.6 и Cray Unicos 9.0.2 (хотя последний представляет только исторический интерес). В некоторых других дистрибутивах Linux (Redhat) он находится в / bin, а / usr / bin / содержит символическую ссылку, указывающую на него.

Это не решает проблему полностью, из-за гибкости envпоиска $PATH. Если вам случится , чтобы получить некоторые скрипты , которые используют другое место для envот вашего, вы только должны знать о том, где ваши envжизни, а также не где perl, pythonи другие переводчики могут быть установлены.

И вам не нужно жестко кодировать, /opt/python/3.3.2/bin/python3.3если это первый python3.3исполняемый файл в вашей переменной PATH. Вы можете просто полагаться на envего поиск, поэтому вам не нужно обновлять каждый скрипт, если вы обновляете его с использованием /opt/python/3.3.3/bin/python3.3. Заголовок вашего скрипта остается прежним:

#! /usr/bin/env python3.3
Энтон
источник
Ага. Спасибо. Я не мог найти никакой информации об этом. Когда я сказал «перемещение» проблемы, я имел в виду, что вместо того, чтобы искать и python perlт. Д., Теперь вам просто нужно выследить env, поэтому та же проблема, но другая цель. Похоже, что envего гораздо легче найти, и, очевидно, он гораздо более универсален, поэтому он все еще чрезвычайно благоприятен. Который отлично отвечает на мой вопрос. Спасибо!
scott_fakename