2013-09-05 85 views
1

我試圖在Git中創建一個預先提交的鉤子,它將檢查任何調試代碼並提示用戶修復它。我有我的grepping一個正則表達式(忽略一個事實,即它不會在多行註釋排除出現!):跨文件系統的grep在shell腳本中沒有輸出

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。可能有些東西顯而易見,但我處於一個鬆散的狀態。

任何幫助將不勝感激!謝謝。

編輯:

這是確切的劇本,即使它在儘可能早的階段因不能夠真正做到第一位到。因爲它可能是最好的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不起作用。

編輯二:

如果你想知道,我的ENV如下...

[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 shell,這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 

編輯:在Ubuntu上,/bin/sh是破折號,Debian的Almquist貝殼。像Bourne shell一樣,短劃線也相當有限,並且不支持大括號擴展。有關可移植性問題和破折號的討論,請參閱this page

+0

嗨,謝謝。那麼,實際上沒有什麼更多的補充。代碼片段*非常多。我嘗試用'#!/ bin/bash'來代替,它沒有任何區別。給我一秒鐘,我會編輯我的問題... –

+0

@MattFletcher其實,還有更多要補充的:你用橢圓代替了你的大部分腳本。調試你看不到的東西是非常困難的,這也許可以解釋爲什麼你的問題沒有更多的答案。一般來說,你應該發佈完整的代碼(複製粘貼你實際運行的腳本*),以及輸入,期望輸出和實際輸出。 – ThisSuitIsBlackNot

+0

我這樣做只是因爲我認爲有相同的非常長的代碼重複多次運行邊緣會使人們難以閱讀和分散人們的注意力。我現在已經更新了我的問題,希望能稍微詳細一點:) Cheers –

相關問題