在teminal裡,我們可以透過python a.py
或是g++ a.cpp -o example.out
./example.out
來執行自己寫好的程式,shell script就是把這些指令,有系統的統整,並包裝成一個腳本。
EXAMPLE view.sh
#!/bin/bash
cd ~
find hw1*
當你執行這隻shell script的時候,系統就等於吃到了兩個指令:
(1) 先移動到根目錄。
(2) 尋找目錄內hw1開頭的檔案
至於一開始的#!/bin/bash
是確保你的語言是bash
這應該是大家第一次接觸shell script最擔心的事了,如果大家的架構簡單的話,這整學期其實只會用到兩個指令: python、wget
python
大家應該很熟悉了吧,但這裡說明一下,什麼叫不要把路徑寫死:
在執行檔案的時候,如果你把讀檔案的路徑寫在程式裡面,那這支程式在更換使用者的時候就很容易發生讀不到檔案或是crash等情形。
所以在真正使用的情形上,我們會寫成 python hw1.py ./data/input.csv ./output.csv
也就是透過使用者自己決定程式裡面的變數。
至於後面的路徑怎麼被使用,可以使用python的函式庫sys
或是argparse
以上面的command為例:
sys.argv[1] = './data/input.csv'
、sys.argv[2] = './output.csv'
在程式裡的話,就可以透過 pd.read_csv(sys.argv[1])
進行讀檔,
或是 open(sys.argv[2], 'w')
建立檔案
稍微要注意的是,用sys.argv
讀進來的值type=str
如果有其他用途,就要自己再做一次型態轉換。
wget
這個指令大概要等大家變成AI訓練師之後才會使用,用途是下載預先存好的檔案,這裡推薦大家的雲端平台是dropbox,以下的舉例也都是基於dropbox。
step1 在雲端上傳一個檔案之後,把共享打開會拿到一個連結,這個大家應該都有使用過吧…
step2 透過第一步,會拿到一個 https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=0 長這樣的連結。
step3 恭喜你,可以動手寫command了,大概的寫法會長這樣:
wget https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=1 -O example.jpg
細心的你們一定有注意到兩個前面沒說的東西:
(1) dropbox共享連結的結尾不一樣了,這是因為dl=0
預設是在瀏覽器中開啟,如果要強制下載的話,要使用 dl=1
。
(2) -O
的falg,這個跟其他命令的用法一樣,就是以…的名稱輸出。
以上面的command為例,整句話的意思就會是,從https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=1
下載檔案,並以example.jpg
的名字儲存。
知道怎麼寫路徑,知道怎麼下指令了,接著就是寫shell script了,應該有些人看不懂投影片裡bash hw1.sh [input_file] [output_file]
是什麼意思
其實沒有想像中複雜。
就是執行的時候,會把兩串字串[input_file]
、[output_file]
餵給hw1.sh
那怎麼接收呢?這時候就要用$
了,$
代表預設變數:
bash hw1.sh [input_file] [output_file]
$0 $1 $2
在這個例子裡$1=[input_file]
$2=[output_file]
也就是說我們可以利用$1
$2
再把指令塞進其他command,是不是覺得似曾相似,怎麼跟python的指令有87趴像。
如果你很有耐心看到這裡,那你會發現…
我會直接把hw1的shell script怎麼寫打出來xd
Example hw1.sh
#!/bin/bash
python hw1_test.py $1 $2
至於 hw1_test.py 裡會出現
test = pd.read_csv(sys.argv[1], names=index)
fout = open(sys.argv[2], 'w')
當我們運行bash hw1.sh ./data/test.csv ./output.csv
的時候,
就等於我們下了python hw1_test.py ./data/test.csv ./output.csv
的指令
Example hw3.sh
wget https://www.dropbox.com/s/balabala_model?dl=1 -O 'CNN_model.pkl'
python test.py $1 $2 CNN_model.pkl
至於這個,就不方便多說了^^