Як викликати функції 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?

Відповіді:


25

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

Наприклад, у мене є файл під назвою say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

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

[john @ awesome ~] $ 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.