相對路徑|AI 時代下,你所該知道的 Linux 使用邏輯 03
從一個點、兩個點看懂相對路徑,再看兩個 AI 同時做事時,檔案為什麼會寫入失敗,或出現在錯誤的位置。
此文章也有影片介紹,可以搭配影片一起學習!
以下正式開始文章
AI 幫你做事情的時候,常常會寫 Script。你可以先把它想成,把要執行的指令寫進一個檔案,讓電腦照著做。
過程中,它需要找到各種檔案,所以路徑就很重要。這些路徑有時候是程式把不同部分接起來的,看起來就會很奇怪。
看起來很奇怪的路徑,不一定是錯的,要看它最後走到哪裡。但是起點不對,或者中間接錯,就可能找不到檔案。
這一篇,我們就來看看相對路徑怎麼從現在的位置,走到另外一個地方。後面再用兩個視窗,模擬兩個 AI 同時做事,看路徑出問題時會發生什麼。
這個系列要補什麼
這個系列要補足一些在 AI 時代下,大家可能不太清楚的系統邏輯。
這篇用 Git Bash,在 Windows 底下模擬 Linux 的操作,所以會出現一些 Windows 才有的路徑。但是觀念上,拿去 Linux 和 macOS 用是一樣的。
那接下來,我們就先從指令的使用說明怎麼看開始。
指令有很多功能,要去哪裡看
ls 有很多功能,要去哪裡看它能做什麼?
在 Linux 上可以打 man 加上指令,它會顯示使用說明,也就是 documentation。
$ man ls
這次示範的 Git Bash 沒有 man,回覆的錯誤裡會看到 man: command not found。
ls 這個指令會列出這個資料夾裡的檔案和資料夾,預設不顯示隱藏檔。那就加 --help,使用說明會直接印出來。下面先看實際輸出的開頭。
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
第一行是使用方式:ls,後面加 option,再加你的檔案。這裡的 option 就是選項;方括號表示裡面的部分可以省略,不是要照著打。
option 有很多,我們現在只要看這個 -a。在說明裡可以找到這一行:
-a, --all do not ignore entries starting with .
也就是不要忽略掉點開頭的項目。

pwd 也可以這樣查。它會顯示出你現在自己的位置,使用說明的開頭是:
$ pwd --help
pwd: pwd [-LPW]
Print the name of the current working directory.
指令實在太多,不同版本也不太一樣,我不會全部研究透徹,先記得要用的就好。
點開頭的隱藏檔,和權限是兩件事
那這個點開頭的檔案,又是什麼?
我們先清掉畫面。clear 只清掉看得到的畫面,不會清掉已經執行過的指令。後面換一件事講,我們也先清掉畫面再開始。
$ clear
檔案名稱是點什麼什麼什麼,代表它是隱藏檔。不一定是系統用的,也可能是某個程式在用,平常不會顯示出來。
能不能修改,是由權限決定的。隱藏起來和能不能改,是兩件不同的事。玩過 Git 的話,你可能看過 .gitignore,它就是一個隱藏檔。
cd 這個指令是切換路徑,也就是進到你要的資料夾。先用 cd ~ 回到家目錄,再用 ls 看一下。
$ cd ~
$ ls
AppData
Desktop
Downloads
Pictures
Public
你的內容可能跟我不一樣。接著加上 -a。
$ ls -a
.
..
.bash_history
AppData
Desktop
Downloads
Pictures
Public
這次多了一個點、兩個點,還有 .bash_history。

我們按上、按下,叫出之前打過的指令,就是 Bash 記在這種檔案裡。
按一下鍵盤的 ↑,會叫回上一個指令;再按一下,就再往前一個。按 ↓,就往比較新的那個指令走。
例如剛打過 pwd,再打過 ls -a,按一下 ↑ 叫回的是 ls -a,再按一下 ↑ 就叫回 pwd。接著按 ↓,又會回到比較新的 ls -a。
這只是叫回來,還沒有執行,要按 Enter 才會執行。如果只是試試,可以按幾下 Backspace,把叫回來的指令刪掉。
這些檔案之後設定時都可能成為主角,內容先不管。我們先來看,最前面的一個點和兩個點是什麼。
一個點是自己,兩個點是上一層
這兩個是相對路徑裡非常有用的東西。
現在在家目錄,打 cd .,再用 pwd 看一下自己在哪裡。
$ cd .
$ pwd
/c/Users/pbuser
你還在原本的路徑,所以一個點 . 就是自己。
那兩個點呢?
$ cd ..
$ pwd
/c/Users
cd .. 就往前退一層。原本在 pbuser 裡,退一層就到 Users。
再下一次,再往前退。
$ cd ..
$ pwd
/c
再退一次,只剩一條斜線。
$ cd ..
$ pwd
/
這就是根目錄。那再退呢?
$ cd ..
$ pwd
/
還是在根目錄。
根目錄沒辦法再往前退,不管一個點還是兩個點,它都一直在自己這個位置。新手試兩個點,發現怎麼不會動,就是因為已經在根目錄了。
這也是它叫根目錄的原因:沒有任何資料夾包住它。

從下載走到桌面的 Test
我們上一集在桌面建了 Test 資料夾。現在站在下載,要怎麼過去?如果你要跟著做,桌面也要先有這個資料夾。
先清掉畫面,進到下載,用 ls 看一下。
$ cd ~/Downloads
$ ls
這次下載資料夾是空的,所以 ls 沒有列出任何東西。下載跟桌面是平行的,在下載裡面找不到桌面。
上一集用的是絕對路徑,從最前面的斜線一路打下來。
可以先輸入 cd /c/Users/pbuser/De,按一下 Tab,它會幫你補成 Desktop/,再自己輸入 Test。完整指令是:
$ cd /c/Users/pbuser/Desktop/Test
那相對路徑要怎麼走?先回到下載。家目錄也可以用小蝌蚪、小波浪 ~ 代表。
$ cd ~/Downloads
相對路徑的想法是:桌面和下載都在家目錄底下。所以先進到上一層,再進桌面,再進 Test。
$ cd ..
$ cd Desktop
$ cd Test
$ pwd
/c/Users/pbuser/Desktop/Test
就到了剛剛的位置。
也可以組成一長條。回到下載,再打「上一層的桌面的 Test」。
$ cd ~/Downloads
$ cd ../Desktop/Test
$ pwd
/c/Users/pbuser/Desktop/Test
.. 先回家目錄,Desktop 進桌面,Test 再進桌面裡的資料夾。分三次打,或接成一條路徑,最後都到了同一個地方。

從 Test 走回下載
現在在 Test 裡,要怎麼走回下載?
往前一格是桌面,再往前一格是家目錄,下載在家目錄裡。所以往前兩次,再進下載。
先往前一次到桌面,看一下有什麼。
$ cd ..
$ ls
Test
再往前一次,就看到家目錄的東西,裡面有下載。
$ cd ..
$ ls
AppData
Desktop
Downloads
Pictures
Public
接著就能進下載了。
$ cd Downloads
$ pwd
/c/Users/pbuser/Downloads
組成一長條,就是兩個點、兩個點,再進下載。回到 Test 試一次。
$ cd ~/Desktop/Test
$ cd ../../Downloads
$ pwd
/c/Users/pbuser/Downloads
這裡有兩段 ..,每一段退一層。第一段從 Test 回桌面,第二段從桌面回家目錄,再進 Downloads。
路徑可以進去,又出來嗎
那如果想做一個很奇怪的動作,可不可以串得亂七八糟,進去又出來?
當然可以。
現在在下載,先輸入這一段,先不要按 Enter:
cd ../Desktop/Test/../../
從下載往前,進桌面、進 Test,再往前、往前。這樣就回到了家目錄。
這時按兩下 Tab,可以看到這條路徑走到的位置裡有什麼。畫面列出的是家目錄的東西,例如 Desktop、Downloads。
再接上三段 ../,按 Enter,完整指令和結果是:
$ cd ../Desktop/Test/../../../../../
$ pwd
/
就回到根目錄了。
這樣進去又出來是可以的,只是一般人不會這麼做,路徑看起來很奇怪。
有時候這種路徑不是人打的。寫 Script 時,路徑是程式抓出來的,往前往後接在一起,就變成這樣。但它能到達目的地,所以不能光看它長得奇怪,就認為它錯了。
兩個 AI 同時做事,會發生什麼
接下來這段會用到一些比較進階的 Script 指令。你先看就好,不用跟著操作,也不用急著記住每個指令。
這裡用兩個操作視窗,分別代表 AI 一號跟 AI 二號。兩個 AI 的動作,都是用事先寫好的腳本模擬。
目標是在桌面產生報告,桌面才是正確的位置。
一號現在所在的資料夾,叫做「錯誤的位置」,它在桌面底下。工具正常時,會交回 ..,也就是先回上一層的桌面,再把報告寫進去。
第一次:先讓一號做短任務
先讓一號正常執行短任務。執行完,桌面就出現報告了。視窗顯示:
AI一號:寫入成功
資料位置在:
Desktop/AI一號成功產生.txt
這次寫入成功,位置也是我們要的桌面。

第二次:一號在等,二號把工具搬走
先刪掉剛才的報告,重新來一次。
這次做長任務,一號會先等四秒。趁它在等的時候,二號把工具搬到別的地方。
等一號要用的時候,工具已經被搬走,找不到它,就出錯了。
AI一號:執行失敗
無法取得路徑
沒有產生檔案
這次沒有取得能用的路徑,寫入也失敗,桌面沒有報告。

第三次:自動排錯的版本,先正常跑一次
再把這一輪的產物清掉,工具放回去,重新來一次。
先跑自動排錯的版本,二號不搗亂,看看報告會寫到哪裡。
AI一號:寫入成功
資料位置在:
Desktop/AI一號成功產生.txt
工具還在,一號取得了 ..,所以報告一樣寫到桌面。

第四次:同一個版本,這次讓二號搗亂
先刪掉剛才的報告,重新來一次。
還是跑剛剛那個自動排錯的版本。一號等四秒時,二號再把工具搬走。
這次程式把錯誤丟掉,接到空白,卻繼續往下做。畫面說寫入成功了:
AI一號:寫入成功
資料位置在:
Desktop/錯誤的位置/AI一號成功產生.txt
可是桌面沒有出現檔案。那報告在哪裡?
打開桌面的「錯誤的位置」,報告就在裡面。
原本取得的路徑應該是 ..,先回上一層的桌面。這次接到的是空白,少了去桌面那一段,報告就留在這個「錯誤的位置」。
這次檔案有寫出來,但是寫的地方不對。這個自動排錯的版本,只是把錯誤吞掉,沒有修好。

跟 AI 的關係
這個觀念,在 AI 幫你做事情的時候就會用得到。
看起來很奇怪的路徑,不一定是錯的,要看它最後走到哪裡。但是起點不對,或者中間接錯,就可能找不到檔案。
這時候 AI 如果一直修不好,你至少可以先看:它現在在哪裡?這條路徑到底指到哪裡?
下一集:建立資料夾、空檔案,還有命名
下一支影片,我們要教大家兩個指令:用 mkdir 建立資料夾,還有用 touch 建立空的檔案。
然後我們要看一下命名這件事情的問題點。名字取得不好,其實很容易造成一些工具沒辦法使用。
延伸閱讀

