2022-11-05|閱讀時間 ‧ 約 12 分鐘

纏鬥Git Bash

一直以來都是靠手動的方式來進行檔案的版本管理,也就是自己複製檔案,然後改檔名,加入可以識別的編號。不過,越來越覺得,有必要用版本控制系統來幫忙,因為手動的方式實在很累人,而且當需要查找以前更動的內容時,非常沒有效率。當發現Spyder也有支援Git時,就想著:「好吧!那就試用看看好了。」
Git是相當多人使用的版本控制系統,本來只適用在Linux/Unix系統,不過現在也有Windows版本。本著盡量不在Windows安裝軟體的精神,先在Anaconda找找看有沒有,如果沒有的話,再來找看看有沒有免安裝版,再沒有的話,才摸摸鼻子用安裝版。
正如所料,Anaconda怎可能會沒有Git這個這麼多人在用的版本控制系統?滑鼠點個幾下,沒花多少時間就裝好了。裝好之後,在開始功能表中,出現了Git Bash圖示,滑鼠點一下,就進入Git系統,不過……是命令列介面,圖形化介面還得再下指令啟動。
命令列介面就命令列介面囉,反正很久很久以前,在沒有Windows的年代,大夥兒還不是Dos命令列介面用得不亦樂乎!再說多動動手、動動腦也可以延緩老化,降低失智的風險,老用圖形化介面,真的會變得比較懶得動腦筋、記憶力下降。
用了幾天之後,開始覺得受不了一件事了:每次打開Git Bash,都會身處/c/Users/username/Documents這個目錄中。這個目錄就是Windows的「文件」資料夾,利用檔案總管一層一層點進去,就是C:\使用者\username\文件。使用Windows時,通常會把個人的檔案放在C碟之外的分割區,也就是把系統和資料區分開來。現在每次打開Git Bash,都得從「文件」資料夾出發,下指令移到放檔案的資料夾,Git才能找到要管理的檔案。雖然說多動動手、多動動腦好處多多,但這種機械性的重複動作,實在沒必要做太多。那怎麼辦呢?有沒有辦法一打開Git Bash,就自動移到想要去的地方呢?
要想改變程式啟動時的啟始位置,第一個想到的辦法,當然就是去改捷徑檔囉。捷徑檔滑鼠右鍵,在「內容」裡頭的「開始位置」填入啟動時想要直接進入的資料夾位置,這樣就大功告成,從此王子和公主就過著幸福快樂的日子。只是……理想是豐滿的,但現實是骨感的,即便是王子和公主,也還是要吃喝拉撒睡柴米油鹽醬醋茶,本來想著是可以達到目的的做法,實測的結果是:無效!
怎會這樣?!爬文吧!網路上應該有答案。
網路上有不少人提到改「開始位置」的做法,看來這方法應該是可行的,可為什麼就偏偏不靈光?
在網路上看了不少討論之後,突然間醒悟到,那些討論有些是針對Linux上的Git,有些是針對Windows上的Git。而針對Windows上的Git的討論,使用的是Git for Windows,而不是由Anaconda所安裝的Git。再仔細看一下捷徑檔「內容」裡頭的「目標」,哇咧!長長一大串,同時用到了好幾個東西,看來是很難從這裡理出個頭緒來了。不過,在這長長一大串後面的幾個字:bash.exe,倒是可以研究一下,因為讓人想到Linux裡頭的bash。
果然!bash.exe就是Linux裡頭的bash。事實上,Git Bash可以看成是同時提供git和bash功能的shell。這可真是柳暗花明又一村,在Linux裡頭的一些招式,應該可以拿來試看看。
啟動bash的時候,會自動先去找看看有沒有.bashrc、.bash_profile、.bash_login這幾個特定的script檔來執行,所以如果把需要的動作寫在裡頭,應該就能達到目的。
找了老半天,沒有就是沒有,完全沒有這幾個檔案的蹤跡。除了找這幾個特定的檔案外,連conda本身的設定檔都打開來看,仍是一無所獲。不過在看profile.d裡頭的檔案內容時,倒是重溫了一下剛接觸shell script程式時,被逗樂了的心情。
跟其他程式一樣,在shell script程式中,也有條件判斷、迴圈等結構。為了要明確指示出結構從程式的哪一行開始,以及到哪一行結束,不同的程式語言,會有不同的標記方式,有用大刮號的;有在結尾加個關鍵字end的,比較特別的是Python,它不太合群,用的是縮排。至於shell script程式,就更不合群了,除了有do… done,還有if… fi、case… esac。
「done」符合英文文法,可以理解,可是「fi」、「esac」?!這啥鬼玩意兒啊?怎會用些這麼莫名奇妙的字?要用也用比較有意義好記的字,if… end或if… end if;case… end或case… end case,怎都比if… fi、case… esac要容易記。瞪著這些詭異的字眼,突然間,被逗樂了。原來,那並不是什麼詭異的字眼,只不過就是if和case倒過來拼。真虧設計的人想得出來,居然用了個這麼頑皮的方式,來設計充滿高科技硬梆梆感覺的程式語言。有時候真覺得,科技人的心裡頭,其實都住著個頑皮的小男孩。
重溫過往日被逗樂的心情後,繼續想辦法解決問題。
在看profile.d裡頭的檔案內容時,有注意到裡頭用了Windows的環境變數。直接去改Windows的環境變數,應該也可以達到目的。不過,這決不是個好主意,畢竟那是所有應用程式都可能會用到的東西,影響範圍會有多大,實在是沒法知道。
看來只好自己寫shell script了,反正就只是要移動到不同的目錄而已,應該可以很快搞定。
說來無奈,每次只要覺得很簡單很快可以搞定的事情,往往到最後會搞得頭昏腦脹,費盡九牛二虎之力才完成,不禁讓人懷疑,老天爺似乎特別喜歡捉弄太過志得意滿的人。不到一分鐘.bashrc這個shell script就寫好了,就一行程式而已。然後……失敗!沒用!
真的是讓人傻眼,就只有一行程式而已,怎麼會失敗?改用手動執行看看,還是不行。把寫在script裡頭的程式,直接在Git Bash中輸入執行,一點問題都沒有,可以成功移動到想要的目錄去。所以,程式本身沒問題,是其他地方出了問題。這時候,就只能上網找答案了。不過,既然知道現在面對的是bash,那關鍵字就不要用Git Bash,而改用bash。
原來,在執行shell script的時候,會在原本的shell之外,另外開啟subshell去執行。等執行完之後,關閉subshell,然後回到原來的shell,落葉歸根的在原來的shell結束工作。既然最後會回到原來的shell,而原來的shell一直都沒離開原來的位置,所以中間不管subshell溜到哪個目錄去,結果還是會回到原來的目錄。要避免這種狀況,執行shell script的時候,要用source這個指令,或者偷懶用句點「.」代替也可以,這樣shell script就會在原來的shell執行,而不是丟到subshell去執行。既然是在原來的shell執行,所以當shell script裡頭的指令要求移動到其他目錄去的時候,是原來的shell真的移動到那裡去,最後當執行完shell script的工作後,就會拋開一切留在那裡,不會再跑回原來的地方。所以原來執行.bashrc時,下的指令是./.bashrc,現在只要改成source .bashrc,或. .bashrc就可以了。
手動執行測試看看,真的可以耶!哈!總算搞定了!不過為了要能夠自動執行,還得多動些手腳,把原本的.bashrc檔,改寫成兩個檔案。改寫後的兩個檔案,一個是.bashrc檔,裡頭的程式只有一行,就是用source去執行另一個檔案;而另一個檔案,裡頭的程式,就是要移動到其他目錄的指令。
寫兩個只有一行程式的檔案,這種簡單的工作,不到一分鐘就搞定,然後……都說老天爺喜歡捉弄人,然後又是失敗!
天啊!又是哪裡有問題?啟動bash時,不是應該會自動去執行.bashrc這個檔案嗎?怎麼會不行?在裡頭加一行程式,印出些東西,這樣就知道啟動時有沒有執行了。
啟動Git Bash時,居然沒去執行.bashrc檔,啥狀況?
咦?!測試的過程中,曾經為了回到開啟Git Bash時所在的位置,也就是home directory,直接下了指令cd ~,用「~」來取代長長的一串路徑字串,結果到達的目錄是/c/Users/username,而不是/c/Users/username/Documents。換句話說,home directory是/c/Users/username,而不是開啟Git Bash時所在的/c/Users/username/Documents。原來如此!難怪沒自動執行.bashrc檔。
把.bashrc檔移到/c/Users/username之後,邊想著這下總該沒問題了,邊重新啟動Git Bash,然後……是的,又再一次的然後。不過這次成功了,只是有幾行警告文字出現,說是設定有問題,找不到.bash_profile、.bash_login、.profile其中任何一個檔案,然後很貼心地幫忙造出.bash_profile這個檔案,並把.bashrc的內容放進去。呃……印象中在捷徑檔「內容」裡頭的「目標」那一欄,裡頭長長一大串字的最後,有著bash.exe --login幾個字。啟動bash時,如果有給login這個選項,會去找那三個檔案來執行;如果沒有給login這個選項,才會去執行.bashrc檔。所以說,開啟Git Bash時,會去自動執行的,不是.bashrc,把檔名改成.bash_profile就可以了。
或許是被老天爺作弄好幾次之後,不再信心十足覺得一定沒問題,老天爺認為孺子可教,不再作弄人;也或許是老天爺玩夠了,這一次,總算成功了,王子與公主終於可以過著幸福快樂的生活了。
就在開始動筆寫這篇隨筆前,赫然發現,老天爺其實還是挺照顧人的。怎麼說呢?先前發現檔案放錯地方時,只把後來改成.bash_profile的.bashrc移到home directory,也就是/c/Users/username,而把另一個檔案仍放在/c/Users/username/Documents。如果那時候把兩個檔案都移到home directory,那就會出問題,然後又是一段艱苦的奮鬥旅程。至於為什麼這樣會出問題呢?推測可能的原因,應該是啟動Git Bash後,即使沒有.bash_profile這個檔案,也會執行一堆設定好的指令,裡頭一定包括移動到/c/Users/username/Documents去。現在有.bash_profile這個檔案也要執行,那就等所有指令都執行完後再來執行。也就是說,執行.bash_profile時,所在的位置是在/c/Users/username/Documents。另一個檔案如果不是放在這裡,會找不到而出錯。至於是不是真的是這個樣子,實在是沒力氣去深究了。話說回來,即使想深究,也不知從何找起,畢竟是透過Anaconda安裝在Windows上,檔案和目錄擺放的位置跟在Linux系統上不太一樣。這場和Git Bash的較量,應該就在這兒打住,或許哪天因緣巧合之下,答案會出現也說不定。
Git Bash還真是難纏啊!
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.