Как вызвать функцию из bash_profile в bash-скрипте

Вопрос или проблема

У меня есть функция в .bash_profile

certspotter(){
curl -s https://certspotter.com/api/v0/certs\?domain\=$1 | jq '.[].dns_names[]' | sed 's/\"//g' | sed 's/\*\.//g' | sort -u | grep $1
}

и я пытаюсь вызвать эту функцию в bash-скрипте test.sh

Но получаю ошибку, как показано ниже

test.sh: 4: test.sh: certspotter: not found

Есть ли способ вызвать это в этом скрипте

Вы должны экспортировать функцию там, где она определена (в .bash_profile)

export -f certspotter

Кажется, здесь есть две проблемы. Во-первых, для определения функции требуется ключевое слово function, по крайней мере, на моей системе, поэтому определение функции должно быть:

function certspotter(){
    curl -s https://certspotter.com/api/v0/certs\?domain\=$1 | jq '.[].dns_names[]' | sed 's/\"//g' | sed 's/\*\.//g' | sort -u | grep $1
}

Затем, как упомянуто в комментариях, скрипт, вызывающий функцию, должен выполнить source файла, содержащего функцию. Как у вас сейчас всё настроено, это будет:

. .bash_profile

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

Ответ или решение

Чтобы вызвать функцию, определенную в файле .bash_profile, в bash-скрипте, необходимо выполнить несколько действий. Рассмотрим пошагово, как правильно сделать это:

Шаг 1: Определение и экспорт функции в .bash_profile

В вашем файле .bash_profile функция определена следующим образом:

certspotter(){
    curl -s "https://certspotter.com/api/v0/certs?domain=$1" | jq '.[].dns_names[]' | sed 's/\"//g' | sed 's/\*\.//g' | sort -u | grep $1
}

Добавьте экспорт функции, чтобы она была доступна в других скриптах:

export -f certspotter

Это необходимо для того, чтобы функция была "видима" в средах, которые порождаются из текущего сеанса.

Шаг 2: Изменение скрипта test.sh

Теперь необходимо, чтобы ваш скрипт test.sh "узнал" о существовании функции certspotter. Для этого его нужно "подключить" к .bash_profile. Для этого добавьте в начало скрипта следующую строку:

. ~/.bash_profile

Либо так:

source ~/.bash_profile

Эти команды помогут включить содержимое вашего .bash_profile в текущий скрипт.

Шаг 3: Использование хорошей практики

Если вы планируете часто использовать функцию certspotter, рекомендуется создать отдельный файл, например, certspotter.sh, содержащий только эту функцию. Это позволит упростить загрузку функций в различные скрипты без необходимости подключения ко всему .bash_profile:

  1. Создайте файл certspotter.sh:

    function certspotter(){
        curl -s "https://certspotter.com/api/v0/certs?domain=$1" | jq '.[].dns_names[]' | sed 's/\"//g' | sed 's/\*\.//g' | sort -u | grep $1
    }
  2. В .bash_profile и скрипте test.sh добавьте строку:

    source /path/to/certspotter.sh

Заключение

Таким образом, вы обеспечите доступность функции certspotter во всех необходимых скриптах, не увеличивая их зависимость от обширного содержания .bash_profile. Этот подход не только повысит надежность и поддержку ваших скриптов, но и окажет положительный эффект на их производительность, поскольку вы загружаете в них только необходимые компоненты. Optimizируйте ваши разработки для лучшей работы системы в целом.

Оцените материал
Добавить комментарий

Капча загружается...