В чем разница между выполнением сценария оболочки как ./script.sh и sh script.sh - PullRequest
18 голосов
/ 18 марта 2010

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

#!/bin/bash

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

something | tee logfile 

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

 $./script.sh

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

$sh script.sh 

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

Ответы [ 3 ]

23 голосов
/ 18 марта 2010

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

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

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

1 голос
/ 18 марта 2010

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

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

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

#!/usr/bin/env sh
0 голосов
/ 18 марта 2010

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

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

Пожалуйста, оставьте сообщение об ошибке для дальнейших ответов.

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

...