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