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

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

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

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

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

myScript.sh func()
4b9b3361

Ответ 1

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

Ответ 2

Хорошо, в то время как другие ответы правильные - вы можете, конечно, сделать что-то еще: если у вас есть доступ к bash script, вы можете его изменить и просто поместить в конце специальный параметр "[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

Ответ 3

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

. ./myScript.sh && function_name

Ответ 4

Вкратце, нет.

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

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

Ответ 5

У меня есть ситуация, когда мне нужна функция из bash script, которая не должна выполняться раньше (например, через 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

Ответ 6

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

Если у вас есть bash script, называемый "control", и внутри него вы имеете функцию "build":

function build() { 
  ... 
}

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

./control build

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

another_folder/control build

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

./control.sh build