2012-02-23 52 views
3

我需要在存儲庫中收到推送時運行某個命令。該二進制文件位於我添加到.bashrc的自定義路徑中,並且可以從shell正常工作。我寫了一個小腳本作爲git鉤子。但是,.bashrc添加似乎不會影響此腳本。

我試過把bash ~/.bashrc放在腳本的頂部,但沒有奏效。如果我手動運行腳本,說$ sh post-receive,它工作得很好。哪裏不對?

回答

3

該腳本可能以其他用戶身份運行,或者正在使用選項禁用交互功能和/或啓動腳本。這是應該的;這裏真的沒有什麼是「錯誤的」。

您可以添加. /home/you/.bashrc作爲快速和骯髒的解決方法;或者更恰當地說,直接修改腳本的PATH;或者甚至更適當地模塊化依賴關係,例如通過將代碼放在一個單獨的文件中,您可以從.bashrc和這個腳本中找到這兩個文件 - 但對於這種孤立的情況,這肯定是過度的。

「包含」shell scipt文件的命令稱爲「source」或「dot」;在Bash中,source可作爲的代名詞,但在適當的Bourne shell,它是一個字面點(又名時期,句號):

. /path/to/stuff 
+0

的點命令的伎倆=)謝謝!不知道。 – 2012-02-23 17:32:20

+1

這對修復作爲git'post-update'鉤子一部分遇到的Jekyll依賴關係非常有用。採購'。 〜/ .bash_profile'可能是一種骯髒的方法,但考慮到大多數人會安裝rvm和後續的gem,它很容易成爲跨平臺的解決方案。 – M1ke 2013-11-04 18:31:30

2

bash ~/.bashrc產生一個新的外殼,其執行所謂.bashrc的文件,那就是這個子shell中的任何狀態自然失去了當子shell退出 - 這是對移動到你的實際的第二行前做包含該調用的腳本包含

2

檢查你的.bashrc 在某些DISTRIB,腳本的到底是在交互模式下不執行時跳過。 只需將有用的東西通過跳過部分即可。

它看起來到:

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
    *) return;; 
esac