#git #sh #githooks
Вопрос:
Цель состоит в том, чтобы сделать некоторый набор команд доступным для пользователя после их клонирования/проверки репо.
файл крючка git
#!/bin/sh echo $PWD/dev-commands.sh source $PWD/dev-commands.sh
команда, которую я хочу сделать доступной после имен крючков git dev-commands.sh
#!/bin/sh function greet() { echo Hello }
это, похоже, не делает команду доступной. если я запущу исходный код dev-commands.sh в каталоге вручную это делает greet
команды доступными..
какие-нибудь советы?
Ответ №1:
Исходные функции доступны в оболочке, которая их создала, а не в ее родительских оболочках. Вот почему, когда вы пишете сценарий оболочки, он может использовать свои собственные функции, не беспокоясь о том, чтобы вмешиваться в то, что означают команды его вызывающего.
( doit() { echo hi; }; doit ); doit
например, скажет hi
, а затем, очень вероятно, пожалуется -bash: doit: command not found
или эквивалентное сообщение, потому что родители должны были поместить doit
их в подоболочку, у которой есть своя собственная среда, точно так же, как крючки git.
Изменение пространства имен чьей-либо оболочки на лету без их активного сотрудничества может и будет точно описано как вредоносное ПО.
Включите команду настройки, которую они могут отправить, если захотят.
Комментарии:
1. ладно, я понимаю, что ты имеешь в виду. таким образом, вы не можете заставить их запускать сценарии на крючке — вместо этого используйте крючок, чтобы сказать им, чтобы они выполняли определенные команды оболочки, которые делают все доступным. в конечном счете, я хочу, чтобы у них была куча простых команд, доступных для разных конфигураций и всего прочего, так что это имеет смысл
2. Я обычно предоставляю целевые файлы makefile для настройки.
make setup
его довольно легко запомнить, и он может делать все, что вы захотите. Вы даже можете предположить, что они скажутmake -n setup
, чтобы посмотреть, что это даст.3. Обратите внимание, что у bash, в частности, есть «функция», в которой вы можете экспортировать функцию в несвязанную вложенную оболочку с помощью переменных среды. (Bash кодирует функцию как текст, а затем вложенная оболочка сканирует текст и заново создает функцию.) Это имеет некоторые неприятные последствия для безопасности, поэтому можно надеяться, что по умолчанию он отключен…