Несколько Шебангов в одном файле Bash


8

У меня есть скрипт от другого человека, который имеет вид (примечание: это один файл):

#!/bin/bash

some commands
some commands

#!/bin/bash

some commands
some commands

#!/bin/bash

some commands
some commands

Мне интересно, какова цель второго и третьего Шебанга? Это по ошибке или нарочно?


Является постороннее #!/bin/bashпредваряется <<конструкцией (здесь документ) , как: some command <<end_of_script_flag?
— дан

Нет никаких <<конструкций. Просто простые шебанги и некоторые команды удаления (это был скрипт удаления)
— Barat Sahdzijeu

Возможно, сценарий был собран из сценариев, предназначенных для последовательного запуска, или что файл должен был быть разбит на несколько независимых сценариев, но разделение не удалось. Что перед лишними #!строками?
— Жиль "ТАК - перестань быть злым"

@ Жиль, я не верю никаким дополнительным скрытым целям этого сценария. Это статический скрипт с именем Uninstall.command(платформа: Mac OS X).
— Барат Сахдзиуу

Ответы:


9

Если эти строки не являются началом включенных сценариев оболочки, которые должны быть построены, то есть внутри схемы вида:

cat <<end_of_shell_script >dynamically_built_shell
#!/bin/bash
[...]
end_of_shell_script

Тогда повторяющаяся конструкция, которую вы нашли, является результатом многих copy- pasteполных сценариев оболочки, но без достаточной заботы и понимания того, для чего нужен этот очень специальный комментарий к строке 1 сценариев, начиная с #!.

Будьте осторожны перед использованием такого сценария оболочки (нет sudo, нет su:)).


Кстати, там много судо ... Боже ...
— Барат Сахдзиуу

⇒ /bin/rm(+ пустышка, чтобы кормить робота)!
— дан

3
... или объединение нескольких сценариев bash, аналогично тому, как это будет выполнено, если вы sourceзададите им имя. Я не вижу необходимости в мозгах от комментариев, хотя. Это вполне допустимо, и именно поэтому шебанг - это строка комментария.
— 0xC0000022L

После второго просмотра я заметил, что некоторые другие строки повторяются, поэтому я склонен думать, что это просто небрежное копирование-вставка из нескольких скриптов.
— Barat Sahdzijeu

4

Нет цели, это просто комментарии. Если «некоторые команды» не содержат некоторые команды, которые сохраняют это в отдельный файл для последующего выполнения.


Никаких операций записи и последующих исполнений. Этот сценарий представляет собой набор rmопераций, которые удаляют некоторые приложения. Я думал, что это может быть связано с разветвлением новой оболочки, но, очевидно, это была грязная копия, вставленная создателем скрипта.
— Barat Sahdzijeu

@BaratSahdzijeu БУДЬТЕ ОСТОРОЖНЫ С СЛУЧАЙНЫМИ СКРИПТАМИ С rm В ТАМ! Извиняюсь за заглавные буквы, но я не могу подчеркнуть, насколько это важно. Если первоначальный автор допустил правильные ошибки (или, скорее, неправильные ошибки), это может повредить другое программное обеспечение на машине и даже сломать ОС.
— Nzall

Нейт, спасибо! На самом деле я не запускал этот сценарий оболочки. Я использовал его как источник обучения для деинсталлятора на платформе Mac OS X (Linux как OS). Мысль, может быть, она имеет какой-то особый вкус bash, который имеет какое-то значение, повторяется Шебанг внутри сценария.
— Барат Сахдзиуу

При #!этом используется на уровне ядра (см. man execve) В любой системе Unix (OpenBSD, FreeBSD, MacOS X, Kali-linux…). The bashпросто видит это как комментарий.
— дан

@NateKerkhofs А что mv ln cp dd vi ...вместе с 200 другими командами? Почему ты не подчеркиваешь их тоже? Они могут чувствовать себя обделенными.
— ot--
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.