В чем разница между запуском оболочки script как. /script.sh и sh script.sh

У меня есть script, который выглядит как

#!/bin/bash

function something() {
 echo "hello world!!"
}

something | tee logfile 

Я установил разрешение на выполнение в этом файле, и когда я попытаюсь запустить файл, как этот

 $./script.sh

он работает отлично, но когда я запускаю его в командной строке, как этот

$sh script.sh 

Он выдает ошибку. Почему это происходит и каковы способы, которыми я могу это исправить.

Ответы

Ответ 1

Запустив его как ./script.sh, ядро ​​прочитает первую строку (shebang), а затем вызовет bash для интерпретации script. Выполняя его как sh script.sh, использует ту оболочку, в которой ваша система по умолчанию sh to (на Ubuntu это Dash, которая является sh-совместимой, но не поддерживает некоторые дополнительные функции Bash).

Вы можете исправить это, вызвав его как bash script.sh, или если на вашем компьютере вы можете изменить /bin/sh на bash, а не на то, что он сейчас (обычно просто с помощью символической ссылки - rm /bin/sh && ln -s /bin/bash /bin/sh). Или вы можете просто использовать ./script.sh, если это уже работает;)

Если ваша оболочка действительно тире, и вы хотите изменить совместимость script, https://wiki.ubuntu.com/DashAsBinSh содержит полезное руководство по различия. В вашем примере это похоже, что вам просто нужно удалить ключевое слово function.

Ответ 2

если ваш script находится в вашем рабочем каталоге, и вы выдаете ./script.sh, ядро ​​будет читать shebang (первая строка) и выполнить интерпретатор оболочки, который определен. вы также можете вызвать свой script.sh, указав путь интерпретатора, например

/bin/bash myscript.sh
/bin/sh myscript.sh  
/bin/ksh myscript.sh etc 

Кстати, вы можете также поместить свой shebang (если вы не хотите указывать полный путь)

#!/usr/bin/env sh

Ответ 3

sh script.sh заставляет script выполняться в sh-оболочке.

а просто из командной строки использует shell-environmentemnt, в котором вы находитесь.

Отправьте сообщение об ошибке для получения дополнительных ответов.

Случайно, хотя по какой ошибке может быть: путь, указанный в первой строке /bin/ bash, неверен - возможно, bash не установлен?