Несколько Шебангов в одном файле 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

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

gena2x
источник
Никаких операций записи и последующих исполнений. Этот сценарий представляет собой набор 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--