В чем разница между запуском оболочки 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 не установлен?