У меня есть script, который имеет некоторые функции.
Можно ли запустить одну из функций непосредственно из командной строки?
Что-то вроде этого?
myScript.sh func()
У меня есть script, который имеет некоторые функции.
Можно ли запустить одну из функций непосредственно из командной строки?
Что-то вроде этого?
myScript.sh func()
Если script определяет только функции и ничего не делает, вы можете сначала выполнить script в контексте текущей оболочки с помощью команды source
или .
, а затем просто вызвать функцию. Подробнее см. help source
.
Хорошо, в то время как другие ответы правильные - вы можете, конечно, сделать что-то еще: если у вас есть доступ к 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
Следующая команда сначала регистрирует функцию в контексте, а затем вызывает ее:
. ./myScript.sh && function_name
Вкратце, нет.
Вы можете импортировать все функции в script в вашу среду с помощью source
(help source
для получения дополнительной информации), который затем позволит вам вызвать их. Это также приводит к выполнению script, поэтому будьте осторожны.
Невозможно вызвать функцию из оболочки script, как если бы она была разделяемой библиотекой.
У меня есть ситуация, когда мне нужна функция из 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
Изменить: ПРЕДУПРЕЖДЕНИЕ - кажется, что это не работает во всех случаях, но хорошо работает на многих публичных скриптах.
Если у вас есть bash script, называемый "control", и внутри него вы имеете функцию "build":
function build() {
...
}
Затем вы можете вызвать его так (из каталога, где он):
./control build
Если он находится внутри другой папки, это сделает:
another_folder/control build
Если ваш файл называется "control.sh", это, соответственно, сделает вызываемую функцию следующим образом:
./control.sh build