19

Итак, я написал свой первый скрипт bash:

#!/bin/bash
echo 'hello world!'
exit

Я знаю, что он имеет правильное расположение для bash и является исполняемым:

$ which bash
/bin/bash
$ chmod +x myscript.sh

Теперь я хочу запустить его из командной строки, но я получаю сообщение об ошибке:

$ myscript.sh
myscript.sh: command not found

Поэтому вместо этого я пробую это, и это работает:

$ bash myscript.sh
hello world!

Это то, как мне всегда нужно будет это выполнять? Я чувствую, что выполнил другие сценарии, не прибегая к этому bash . Как я могу запустить myscript.sh без предшествующего ему bash?

Обновление: вот хорошее объяснение того, почему и как выполнить скрипт bash.

3 ответа3

28

Вы должны сделать файл исполняемым. Вы можете сделать это с

chmod +x <filename>

где - имя вашего скрипта, а затем вы должны добавить его к ./ чтобы дать команду оболочке запустить файл в локальном каталоге, например:

./script.sh

Вы можете запускать только те файлы, которые находятся в вашем PATH или вы указали путь к ним. ./ , локальный каталог, по умолчанию отсутствует в PATH , потому что кто-то может использовать его в гнусных целях. Представьте себе скрипт с именем ls брошенный в каталог, вы заходите в этот каталог, запускаете ls и этот скрипт делает что-то плохое.

Пока вы занимаетесь этим, вы можете сделать его более переносимым, запустив shell вместо bash, используя:

#!/bin/sh

или запустив bash независимо от того, где он установлен, если он установлен:

#!/usr/bin/env bash
1

Есть 3 способа выполнить скрипт bash. С примером myscript.sh в качестве скрипта, который вы хотите выполнить.

Способ 1

выполнить скрипт как подпроцесс, который вызовет проблемы с правами доступа, если не владелец записи. Вы можете изменить разрешения с помощью chmod.

$ chmod +x myscript.sh

$ ./myscript.sh

Способ 2

запустить скрипт как текущий пользователь. если скрипт bash написан хорошо, в нем не должно быть ошибок.

$ bash myscript.sh

Способ 3

похож на метод 2, но короткий путь

$. MyScript

надеюсь это поможет!:)

1

В дополнение к совету Фернандеса, поставьте перед ним точку, например:

./myscript.sh

По соображениям безопасности текущий каталог никогда не включается в путь выполнения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .