Можно ли вызвать функцию оболочки script из другой оболочки script?
У меня есть 2 сценария оболочки.
Вторая оболочка script содержит следующие функции
second.sh
func1
func2
First.sh вызовет вторую оболочку script с некоторыми параметрами и
вызовет func1 и func2 с некоторыми другими параметрами, специфичными для этой функции.
Вот пример того, что я говорю о
second.sh
val1=`echo $1`
val2=`echo $2`
function func1 {
fun=`echo $1`
book=`echo $2`
}
function func2 {
fun2=`echo $1`
book2=`echo $2`
}
first.sh
second.sh cricket football
func1 love horror
func2 ball mystery
Как я могу это достичь?
Ответы
Ответ 1
Восстановите свой second.sh
script следующим образом:
function func1 {
fun=$1
book=$2
printf "fun=%s,book=%s\n" "${fun}" "${book}"
}
function func2 {
fun2=$1
book2=$2
printf "fun2=%s,book2=%s\n" "${fun2}" "${book2}"
}
Затем вызовите эти функции из script first.sh
следующим образом:
source ./second.sh
func1 love horror
func2 ball mystery
ВЫВОД:
fun=love,book=horror
fun2=ball,book2=mystery
Ответ 2
Вы не можете напрямую вызвать функцию в другой оболочке script.
Вы можете переместить определения функций в отдельный файл, а затем загрузить их в свой script с помощью команды .
, например:
. /path/to/functions.sh
Это будет интерпретировать functions.sh
так, как если бы содержимое содержалось в вашем файле на данный момент. Это общий механизм для реализации общих библиотек функций оболочки.
Ответ 3
Проблема
В настоящее время принятый ответ работает только при важных условиях. Принимая во внимание...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
и
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
это работает, только если first.sh
выполняется из той же директории, где находится first.sh
. То есть. если текущим рабочим путем оболочки является /foo
, попытка выполнить команду
cd /foo
./bar/second.sh
печатает ошибку:
/foo/bar/second.sh: line 4: func1: command not found
Это потому, что source ./first.sh
относится к текущему рабочему пути, а не к пути сценария. Следовательно, одним из решений может быть использование subshell и запуск
(cd /foo/bar; ./second.sh)
Более общее решение
Принимая во внимание...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
и
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
тогда
cd /foo
./bar/second.sh
печатает
Hello World
Как это работает
$0
возвращает относительный или абсолютный путь к исполняемому сценарию
dirname
возвращает относительный путь к каталогу, где существует скрипт $ 0
$( dirname "$0" )
команда dirname "$0"
возвращает относительный
путь к каталогу исполняемого скрипта, который затем используется в качестве аргумента для команды source
- в "second.sh"
/first.sh
просто добавляется имя импортированного сценария оболочки
source
загружает содержимое указанного файла в текущий
ракушка
Ответ 4
Если вы определяете
#!/bin/bash
fun1(){
echo "Fun1 from file1 $1"
}
fun1 Hello
. file2
fun1 Hello
exit 0
в файле1 (chmod 750 file1)
и file2
fun1(){
echo "Fun1 from file2 $1"
}
fun2(){
echo "Fun1 from file1 $1"
}
и запустите. /file 2, вы получите
Fun1 из файла1 Hello
Fun1 из файла2 Hello
Сюрприз!!! Вы переписываете fun1 в файле1 с fun1 из файла2... Чтобы не делать этого, вы должны
declare -f pr_fun1=$fun1
. file2
unset -f fun1
fun1=$pr_fun1
unset -f pr_fun1
fun1 Hello
он сохранит ваше предыдущее определение для fun1 и восстановит его с предыдущим именем, удалив ненужный импортированный.
Каждый раз, когда вы импортируете функции из другого файла, вы можете вспомнить два аспекта:
- вы можете перезаписать существующие те же имена (если это то, что вы хотите, вы должны сохранить их, как описано выше).
- импортировать все содержимое файла импорта (функции и глобальные переменные тоже)
Быть осторожен! Это опасная процедура.
Ответ 5
#vi function.sh
#!/bin/bash
f1() {
echo "Hello $name"
}
f2() {
echo "Enter your name: "
read name
f1
}
f2
#sh function.sh
Здесь функция f2
будет вызывать функцию f1