it-swarm.com.ru

Как я могу запустить функцию из скрипта в командной строке?

У меня есть скрипт, который имеет некоторые функции.

Могу ли я запустить одну из функций прямо из командной строки?

Что-то вроде этого?

myScript.sh func()
85
AAaa

Если сценарий определяет только функции и больше ничего не делает, вы можете сначала выполнить сценарий в контексте текущей оболочки с помощью команды source или ., а затем просто вызвать функцию. Смотрите help source для получения дополнительной информации.

45
Sven Marnach

Что ж, в то время как другие ответы верны - вы, безусловно, можете сделать что-то еще: если у вас есть доступ к скрипту bash, вы можете изменить его и просто поместить в конце специальный параметр "[email protected]", который будет расширен до аргументов команды указанную вами строку, и поскольку она «одна», оболочка попытается назвать их дословно; и здесь вы можете указать имя функции в качестве первого аргумента. Пример: 

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"[email protected]"


$ bash test.sh
$ bash test.sh testA
TEST A 
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2

Для полировки вы можете сначала убедиться, что команда существует и является функцией:

# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
  # call arguments verbatim
  "[email protected]"
else
  # Show a helpful error
  echo "'$1' is not a known function name" >&2
  exit 1
fi
169
sdaau

Следующая команда сначала регистрирует функцию в контексте, а затем вызывает ее:

. ./myScript.sh && function_name
22
TimonWang

Вкратце нет.

Вы можете импортировать все функции в сценарии в свою среду с помощью source (help source для подробностей), который затем позволит вам вызывать их. Это также приводит к выполнению сценария, поэтому будьте осторожны.

Невозможно вызвать функцию из сценария оболочки, как если бы она была общей библиотекой.

11
Sorpigal

У меня есть ситуация, когда мне нужна функция из скрипта bash, которая не должна выполняться раньше (например, с помощью source), и проблема с @$ заключается в том, что myScript.sh запускается дважды, кажется ... Итак, я придумал идея получить функцию с помощью sed:

sed -n "/^func ()/,/^}/p" myScript.sh

И чтобы выполнить его в нужное время, я помещаю его в файл и использую source:

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

1
vchrizz

Правка: ПРЕДУПРЕЖДЕНИЕ - кажется, это работает не во всех случаях, но хорошо работает на многих общедоступных сценариях.

Если у вас есть bash-скрипт с именем «control» и внутри него есть функция «build»:

function build() { 
  ... 
}

Затем вы можете назвать это так (из каталога, где он находится):

./control build

Если это находится в другой папке, это сделало бы это:

another_folder/control build

Если ваш файл называется «control.sh», это соответственно делает функцию вызываемой так:

./control.sh build
0
Arturas M