Как вызывать функции 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файл?

Ответы:


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.