Вопрос или проблема
У меня есть функция в .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
:
-
Создайте файл
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 }
-
В
.bash_profile
и скриптеtest.sh
добавьте строку:source /path/to/certspotter.sh
Заключение
Таким образом, вы обеспечите доступность функции certspotter
во всех необходимых скриптах, не увеличивая их зависимость от обширного содержания .bash_profile
. Этот подход не только повысит надежность и поддержку ваших скриптов, но и окажет положительный эффект на их производительность, поскольку вы загружаете в них только необходимые компоненты. Optimizируйте ваши разработки для лучшей работы системы в целом.