Подтвердить что ты не робот

Можно ли вызвать функцию оболочки 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

Как я могу это достичь?

4b9b3361

Ответ 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