A surprise with how '#!' handles its program argument in practice
Автор обнаружил удивительное поведение shebang (#!) в Unix-системах: ядро Linux, FreeBSD и OpenBSD поддерживает не только абсолютные, но и относительные пути в shebang. Например, можно использовать "#!python3", "#!bin/python3" или "#!../../../usr/bin/python3", и они будут работать при правильном расположении текущего каталога. Это поведение существует с 4.2 BSD (1983 год) и реализовано через вызов namei(), который разрешает пути так же, как и для обычных файлов.
Несмотря на потенциальные проблемы безопасности, такое поведение сохранилось во многих системах. Автор предполагает, что это связано с простотой реализации в ядре и законом Хайрума (Hyrum's Law) - вероятно, кто-то уже использует эту функциональность и зависит от неё. Интересно, что даже OpenBSD, известный вниманием к безопасности, не изменил это поведение.
Комментарии (81)
- Проблема с
#!/bin/bashв NixOS и других системах, где bash не в /bin, подчеркивает важность использования#!/usr/bin/env bashдля переносимости. - Обсуждение подчеркивает, что
#!/usr/bin/env bashявляется наиболее переносимой формой, так как она использует $PATH для поиска bash. - Несколько участников подчеркивают, что
#!/bin/bashможет не работать в некоторых системах, где bash не в /bin. - Обсуждение также затрагивает безопасность:
#!/usr/bin/env bashможет быть опасен, если не указан полный путь, так как это может привести к запуску нежелательного кода.
The Journey Before main() 🔥 Горячее
—
Комментарии (114)
- Обсуждение охватывает вопросы динамического связывания, загрузки ELF-файлов и влияния различных библиотек на размер бинарника, а также затрагивает тему встроенных файлов в бинарнике и использования shebang-ов в Unix-подобных системах.
- Участники обмениваются ссылками на статьи и инструменты, включая https://cpu.land и https://blog.foletta.net/post/2021-04-19-what-the-
- Обсуждение также касается вопросов, связанных с тем, как стек растет вниз, а не вверх, как это обычно изображается в учебниках, и как это влияет на обучение студентов.
- Участники также обсуждают, что влияет на размер бинарника, и какие еще факторы могут влиять на него, включая использование статической линковки, встроенных файлов и других аспектов.
Show HN: Run – a CLI universal code runner I built while learning Rust
Универсальный раннер и умный REPL на Rust, который автоматически определяет язык программирования по расширению файла или shebang и выполняет код без предварительной настройки. Поддерживает Python, JavaScript, Ruby, Go и другие популярные языки, экономя время на переключении между средами.
Инструмент предлагает интерактивный режим с подсветкой синтаксиса и историей команд, а также пакетную обработку файлов. Ключевое преимущество — кроссплатформенность и минимальные зависимости, поскольку написан на Rust. Практический бонус: можно быстро тестировать сниппеты, не покидая терминал.
Комментарии (34)
- Автор представил инструмент
runкак унифицированный REPL для множества языков, позволяющий выполнять код разных языков одной командой без переключения между отдельными REPL. - Обсуждаются технические детали и сравнение с существующими инструментами: шебанг-строка, задачами
just, магическими командами IPython/Jupyter и возможностью запуска скриптов через Bash. - Уточняется классификация языков (Swift, Kotlin) как компилируемых или интерпретируемых в контексте работы инструмента.
- Поднимается вопрос о мотивации создания инструмента и терминологии ("polyglot"), а также простоте добавления поддержки новых языков через реализацию trait на Rust.
- Автор поясняет, что инструмент — это эксперимент новичка в Rust, а не замена существующим решениям.