Когда вы набираете
./program
Оболочка пытается выполнить программу в соответствии с тем, как она определяет, должен ли файл выполняться.Если это двоичный файл, он попытается выполнить подпрограмму ввода.Если оболочка обнаружит, что это скрипт, например, с помощью
#!/bin/sh
или
#!/bin/awk
или, в более общем смысле,
#!/path/to/interpreter
, оболочка пройдетфайл (и любые предоставленные аргументы) в качестве аргументов для предоставленного интерпретатора, который затем выполнит скрипт.Если интерпретатор, указанный в пути, не существует, оболочка выдаст ошибку, и если строка интерпретатора не найдена, оболочка будет считать, что предоставленный сценарий должен выполняться самостоятельно.
Команда
sh program
эквивалентно
./program
, когда первая строка программы содержит
#!/bin/sh
, если предположить, что / bin / sh - это sh на вашем пути (это может быть / system/ bin / sh, например).Передача двоичного файла в sh приведет к тому, что sh будет рассматривать его как сценарий оболочки, а это не так, и двоичный файл не будет интерпретируемой оболочкой (то есть простым текстом).Вот почему вы не можете использовать
sh program
в этом контексте.Также произойдет сбой из-за того, что программа является ruby, awk, sed или чем-то еще, кроме сценария оболочки.