我需要在存儲庫中收到推送時運行某個命令。該二進制文件位於我添加到.bashrc的自定義路徑中,並且可以從shell正常工作。我寫了一個小腳本作爲git鉤子。但是,.bashrc添加似乎不會影響此腳本。
我試過把bash ~/.bashrc
放在腳本的頂部,但沒有奏效。如果我手動運行腳本,說$ sh post-receive
,它工作得很好。哪裏不對?
我需要在存儲庫中收到推送時運行某個命令。該二進制文件位於我添加到.bashrc的自定義路徑中,並且可以從shell正常工作。我寫了一個小腳本作爲git鉤子。但是,.bashrc添加似乎不會影響此腳本。
我試過把bash ~/.bashrc
放在腳本的頂部,但沒有奏效。如果我手動運行腳本,說$ sh post-receive
,它工作得很好。哪裏不對?
該腳本可能以其他用戶身份運行,或者正在使用選項禁用交互功能和/或啓動腳本。這是應該的;這裏真的沒有什麼是「錯誤的」。
您可以添加. /home/you/.bashrc
作爲快速和骯髒的解決方法;或者更恰當地說,直接修改腳本的PATH;或者甚至更適當地模塊化依賴關係,例如通過將代碼放在一個單獨的文件中,您可以從.bashrc
和這個腳本中找到這兩個文件 - 但對於這種孤立的情況,這肯定是過度的。
「包含」shell scipt文件的命令稱爲「source」或「dot」;在Bash中,source
可作爲的代名詞,但在適當的Bourne shell,它是一個字面點(又名時期,句號):
. /path/to/stuff
這bash ~/.bashrc
產生一個新的外殼,其執行所謂.bashrc
的文件,那就是這個子shell中的任何狀態自然失去了當子shell退出 - 這是對移動到你的實際的第二行前做包含該調用的腳本包含。
檢查你的.bashrc 在某些DISTRIB,腳本的到底是在交互模式下不執行時跳過。 只需將有用的東西通過跳過部分即可。
它看起來到:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
的點命令的伎倆=)謝謝!不知道。 – 2012-02-23 17:32:20
這對修復作爲git'post-update'鉤子一部分遇到的Jekyll依賴關係非常有用。採購'。 〜/ .bash_profile'可能是一種骯髒的方法,但考慮到大多數人會安裝rvm和後續的gem,它很容易成爲跨平臺的解決方案。 – M1ke 2013-11-04 18:31:30