2013-09-05 3 views
1

Я пытаюсь создать крюк pre-commit в Git, который проверяет любой код отладки и запрашивает у пользователя его исправить. У меня есть регулярное выражение, которое я для оглавлению (игнорировать тот факт, что он не исключает вхождения в многострочные комментарии!):Grep через файловую систему не имеет вывода в сценарии оболочки

grep -IiRn --exclude-dir={node_modules,vendor,public,lib,contrib} --include=\*.{module,inc,install,php,js} -P '^\s*(?!\/\/)\s*(dpm\(|dsm\(|console.log\()' /path/to/code/ 

Это прекрасно работает, когда я запускаю его, как правило, в консоли, но когда я пытаюсь он в исполняемом файле .sh скрипт ничего не делает. Ни один из следующих не работает для меня:

#!/bin/sh 

grep ... 

MYVAR =`grep ...` # Note the backticks! 
echo $MYVAR 

MYVAR =$(grep ...) 
echo $MYVAR 

MYVAR ="`grep ...`" 
echo $MYVAR 

Я пытался делать это с Python и os.system(), но это ничего не делал ни. Кажется, у него нет STDOUT. Возможно, что-то очевидное, что я пропущу, но у меня свободный конец.

Любая помощь была бы высоко оценена! Благодарю.

Edit:

Это точный сценарий, несмотря на то, что это на самом раннем этапе из-за не в состоянии реально сделать первый бит. Я спрятала точные имена папок, потому что это, вероятно, лучше не делить базу кода моей компании на SO;)

#!/bin/bash 

echo "Test!" 

ONE=`grep -IiRn --exclude-dir={node_modules,vendor,public,lib,contrib} --include=\*.{module,inc,install,php,js} -P '^\s*(?!\/\/)\s*(dpm\(|dsm\(|console.log\()' /company/projects/company/www/sites/all/modules/custom/` 

TWO=$(grep -IiRn --exclude-dir={node_modules,vendor,public,lib,contrib} --include=\*.{coffee} -P '^\s*(?!\#)\s*(dpm\(|dsm\(|console.log)' /company/projects/company/www/sites/all/modules/custom/) 

echo $ONE 
echo "$TWO" 

... и работает bash -x pre-commit возвращается:

[email protected]:/company/projects/company/scripts$ bash -x pre-commit 
+ echo 'Test!' 
Test! 
++ grep -IiRn --exclude-dir=node_modules --exclude-dir=vendor --exclude-dir=public --exclude-dir=lib --exclude-dir=contrib '--include=*.module' '--include=*.inc' '--include=*.install' '--include=*.php' '--include=*.js' -P '^\s*(?!\/\/)\s*(dpm\(|dsm\(|console.log\()' /company/projects/company/www/sites/all/modules/custom/ 
+ ONE='/company/projects/company/www/sites/all/modules/custom/some_module/some_module.report.inc:594: dsm('\''test'\''); 
/company/projects/company/www/sites/all/modules/custom/goals_app/goals_app.module:170: console.log(e.stack); 
/company/projects/company/www/sites/all/modules/custom/company_usage_reports/js/script.js:300:   console.log('\''fetch success'\''); 
/company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_change_workgroup.js:19: console.log('\''wtf?'\''); 
/company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:33:     console.log(resp); 
/company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:39:    console.log(ui.placeholder); 
/company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_goal_form.js:4:  console.log($(".required")); 
/company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder.js:40:     console.log(resp); 
/company/projects/company/www/sites/all/modules/custom/company_goals/js/views/goal-list.js:87:   console.log(data);' 
++ grep -IiRn --exclude-dir=node_modules --exclude-dir=vendor --exclude-dir=public --exclude-dir=lib --exclude-dir=contrib '--include=*.{coffee}' -P '^\s*(?!\#)\s*(dpm\(|dsm\(|console.log)' /company/projects/company/www/sites/all/modules/custom/ 
+ TWO= 
+ echo /company/projects/company/www/sites/all/modules/custom/some_module/some_module.report.inc:594: 'dsm('\''test'\'');' /company/projects/company/www/sites/all/modules/custom/goals_app/goals_app.module:170: 'console.log(e.stack);' /company/projects/company/www/sites/all/modules/custom/company_usage_reports/js/script.js:300: 'console.log('\''fetch' 'success'\'');' /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_change_workgroup.js:19: 'console.log('\''wtf?'\'');' /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:33: 'console.log(resp);' /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:39: 'console.log(ui.placeholder);' /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_goal_form.js:4: 'console.log($(' '".required"' '));' /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder.js:40: 'console.log(resp);' /company/projects/company/www/sites/all/modules/custom/company_goals/js/views/goal-list.js:87: 'console.log(data);' 
/company/projects/company/www/sites/all/modules/custom/some_module/some_module.report.inc:594: dsm('test'); /company/projects/company/www/sites/all/modules/custom/goals_app/goals_app.module:170: console.log(e.stack); /company/projects/company/www/sites/all/modules/custom/company_usage_reports/js/script.js:300: console.log('fetch success'); /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_change_workgroup.js:19: console.log('wtf?'); /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:33: console.log(resp); /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder_table.js:39: console.log(ui.placeholder); /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_goal_form.js:4: console.log($(".required")); /company/projects/company/www/sites/all/modules/custom/another_module/js/another_module_reorder.js:40: console.log(resp); /company/projects/company/www/sites/all/modules/custom/company_goals/js/views/goal-list.js:87: console.log(data); 
+ echo '' 

... но работает он без флага -x STILL не работает.

Редактировать два:

В случае, если кто-то интересно, мой окр выглядит следующим образом ...

[email protected]:~$ uname -a 
Linux ip-12-34-56-78 3.2.0-31-virtual #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 
[email protected]:~$ whereis sh && whereis bash 
sh: /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz 
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz 
+1

Вы не можете иметь пробелы до или после знака равенства '=' в присваивании переменной. Попробуйте 'MYVAR = $ (....)' без пробелов. Также было бы лучше процитировать переменную в команде 'echo', как в' echo '$ MYVAR' ', в противном случае возможные символы новой строки будут преобразованы в пробелы – user000001

+0

Спасибо за ответ: ни одна из этих вещей не изменилась. –

+3

опубликуйте свой реальный скрипт – KevinDTimm

ответ

1

Я не могу сказать точно, пока не выкладываю фактический скрипт вы работаете, но в текущем фрагменте кода есть

#!/bin/sh 

в зависимости от операционной системы, это может быть ссылка на /bin/bash, например, или это может быть фактическим Bourne оболочки, которая does not support brace expansion (например, {a, b, c}). Даже если /bin/sh указывает на /bin/bash на вашем компьютере, вы должны использовать только переносные конструкции, если ваш shebang равен #!/bin/sh (т. Е. Что вы имеете в виду). Если вы хотите использовать расширение скобки в своем скрипте, измените shebang на #!/bin/bash.

Если вы положили

set -x 

в верхней части сценария, он будет печатать подробную информацию, которая может помочь при отладке. Вы также можете сделать это путем вызова оболочки непосредственно вместо того, чтобы модифицировать скрипт, например

sh -x /path/to/script 

или

bash -x /path/to/script 

EDIT: В Ubuntu /bin/sh является дефис, то Debian Альмквист оболочка.Подобно оболочке Bourne, тире довольно ограничительно и не поддерживает расширение скобки. См. this page для обсуждения проблем с переносимостью и тире.

+0

Привет, спасибо. Ну, на самом деле нечего добавить. Фрагмент * - это код, в значительной степени. Вместо этого я попытался использовать '#!/Bin/bash', и это не имело значения. Дайте мне секунду, и я отредактирую свой вопрос ... –

+0

@MattFletcher На самом деле, есть еще что добавить: вы заменили большую часть своего скрипта эллипсами. Очень сложно отлаживать то, что вы не можете видеть, что может объяснить, почему на ваш вопрос больше нет ответов. В общем, на SO, вы должны опубликовать полный код (скопировать-вставить скрипт, который вы * фактически запустили *), а также ввод, ожидаемый вывод и фактический вывод. – ThisSuitIsBlackNot

+0

Я сделал это только потому, что думал, что одна и та же очень длинная строка кода, которая проходит от края, повторяемого несколько раз, затруднит чтение и отвлечение людей от рассматриваемой точки. Я обновил свой вопрос сейчас, надеюсь, будет немного более подробным :) Cheers –