Как вызывать функции bash

28

Может быть, я смотрю на это неправильно ... Но вот я то, что я пытаюсь сделать. Я делаю большую часть своей работы с Java, но просто переключился на среду Unix (Bash). Я делаю это:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Но у меня есть две функции в моем файле, и я хочу иметь возможность вызывать их отдельно от командной строки. Т.е.: myFunc.ls2()или даже просто ls2. Я знаю, что могу добавить функции в свой .bashrcфайл, но есть ли другой способ выполнить эти функции, не добавляя их в свой .bashrcфайл?

sixtyfootersdude
источник

Ответы:

26

Один из способов сделать это, который включает в себя немного больше ввода, - с помощью sourceкоманды. Чтобы вызвать функцию из myFunc, вы можете использовать ее, source myFunc; ls2и она выдаст Hello World.

Так, например, у меня есть файл с именем say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

Теперь я хочу вызвать его talk()функцию из командной строки:

[john @ удивительно ~] $ source say.sh; разговаривать
Здравствуй!

чтобы вызвать его из другого скрипта bash:

#!/bin/bash
source say.sh
talk

Вы также можете поместить каждый в отдельный скрипт и добавить их в каталог, который находится в вашей переменной PATH.

так, например, в одном названном скрипте helloвы должны иметь:

#!/bin/bash
echo "Hello World"

Теперь поместите его в один из каталогов в вашем PATH, который вы можете просмотреть, запустив echo $PATH. Вы можете добавить другой каталог в вашу PATH, если хотите, или использовать существующий. Как только вы скопировали файл туда, сделайте его исполняемым с chmod +x filename.

Джон Т
источник
3
Просто чтобы прояснить: вам нужно всего лишь один раз создать файл для запуска скрипта или оболочки. После этого вы можете вызывать функцию столько раз, сколько захотите, без повторной ссылки на исходный файл.
Приостановлено до дальнейшего уведомления.
5

Другой подход заключается в создании сценария с именем functions.sh(например, в ~/binкаталоге).

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

Наконец, вам просто нужно добавить source ~/bin/functions.shстроку в ваш .bashrcфайл. Таким образом, вы сможете вызывать их из командной строки, вы .bashrcостанетесь чистыми, и у вас будет определенное место для ваших личных функций.

дебаггер
источник
5

Если вы похожи на меня, вы не хотите загромождать свое окружение функциями. У вас также есть группа функций, которые связаны друг с другом в смысле того, что они делают, поэтому имеет смысл поместить их в один и тот же файл сценария. (Я знаю, что папка с несколькими файлами может служить той же цели). Вот возможное решение, которое позволяет вам вызывать определенную функцию в сценарии:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$
Майк Водарчик
источник
Мне это нравится намного больше, чем sourceпотому, что он может обрабатывать две функции с одинаковыми именами в двух разных файлах sh. Я усовершенствовал его для обработки произвольного числа параметров, заменив его $1 $2 $3 $4 $5наFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Чак Уилбур
@ChuckWilbur: зачем прыгать через обручи? Просто измените последнюю строку на "$@". PS Ваш подход на самом деле неверен; последняя часть должна быть "$FUNC_CALL" "$@"  (т.е.  $FUNC_CALLдолжна быть в кавычках).
Скотт
Что такое "$FUNC_CALL"?
Ctrl-Alt-Delor