26

Может быть, я смотрю на это не так ... Но здесь я то, что я пытаюсь сделать. Я делаю большую часть своей работы с 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?

4 ответа4

23

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

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

#!/bin/bash

function talk()
{
        echo "hi!"
}

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

[john@awesome ~]$ source say.sh; talk
hi!

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

#!/bin/bash
source say.sh
talk

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

так, например, в одном скрипте с именем hello вас будет:

#!/bin/bash
echo "Hello World"

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

4

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

$ 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    
$
4

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

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

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

0

Оператор точки или встроенный в source bash аналогичен оператору import в Java.

Вы можете прочитать больше об операторе точки или встроенном source.

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