[問題] 在bash裡面呼叫外部程式(已解:回饋script)

看板Linux作者 (Baska)時間10年前 (2016/01/27 17:38), 10年前編輯推噓1(2180)
留言83則, 5人參與, 最新討論串1/1
=======問題已解 回饋code給大家以後用========= 感謝各位大大細心的分享跟教導,這隻小script分享給 之後跟我一樣有大量xlsx轉csv的人,使用方法只要 sh script.sh "存取資料夾" 便會把你該資料夾所有xlsx轉成csv檔 但記得要裝 python的xlsx2csv 參考: sudo pip install xlsx2csv ========ˇscript============ #!/bin/bash # this script have dependence package of Python "xlsx2csv" sudo PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~/bin sudo export PATH sudo echo "Start translate !" mkdir $1 for f in `ls -1 *.xlsx` do xlsx2csv $f $1/${f%.*}.csv; echo ${f%.*} done echo "Translation done" ~ ============================================== 由於對linux 的bash一些比較特殊的寫法還不是那麼熟練 想跟各位linux先進請教一個寫bash時的問題 想做的事情是: 用bash的方式進行xlsx轉檔,這裡我呼叫了一個python 工具 xlsx2csv , 這個用法在 terminal時已經確定可以 使用 , 而且轉換效果很好 遇到的問題: 1. 一直出現中文檔名亂碼問題 , 原始檔案是big5沒錯 2. 不確定這麼寫能不能像teminal一樣直接叫到python 的xlsx2csv 錯誤範例: ======================================================================== #!/bin/bash PATH = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH sudo echo "Start translate !" sudo xlsx2csv 2011某中文檔名.xlsx Test_covert/2011某中文檔名.csv echo "Translation done" ======================================================================= 這只是我在做初步測試用bash 仿製我在terminal做的行為,且在terminal已經確定 會有我要的結果 , 但bash上面我一直沒有確切的方向,查也都只查到bash的一般語法 會需要這麼做主要是會批量轉檔的需求,所以後續還要串loop還有讓檔名重新產生 用過一般的批量轉檔程式但出來的結果是資料 "看起來" 沒有任何問題,但一旦經過 任何程式呼叫後 , 會有大量的資料在呼叫過程中無故遺失,而用command line呼叫手轉 的資料則沒有這問題 雖然可以另外寫python code直接做這件事情,但目前我試過最快且最穩的是command line 這個方法,加上很想知道如果我在 bash 裡面要呼叫非一般shell的程式還有做字串重組 跟commnad重新產生 (有點像eval 但我還不確定bash叫什麼) , 對小弟來說算是一個有趣 的應用,想問各位先進是否有做過這件事情 ??? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.196.140 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1453887490.A.485.html

01/27 18:04, , 1F
for f in `ls -1 *.xlsx`
01/27 18:04, 1F

01/27 18:05, , 2F
do xlsx2cxv $f Test_convert/${f%.*}.csv
01/27 18:05, 2F

01/27 18:05, , 3F
問的是這種嗎 ?
01/27 18:05, 3F

01/27 18:05, , 4F
啊 少了 done
01/27 18:05, 4F

01/27 18:08, , 5F
關於字串改寫可以參考 bash manpage 的 Parameter Expansion
01/27 18:08, 5F

01/27 18:18, , 6F
真不愧是CP64大師<(_ _)>
01/27 18:18, 6F

01/27 20:55, , 7F
感謝CP64大大,我可以叫到我要的檔案了,不過shell問題我
01/27 20:55, 7F

01/27 20:56, , 8F
還沒搞定,會一直顯示找不到 xlsx2csv的方法,我還在研究
01/27 20:56, 8F

01/27 20:56, , 9F
怎麼得到一般操作的完整shell PATH 資訊
01/27 20:56, 9F

01/27 21:13, , 10F
你下個 sudo env 看輸出應該就會知道發生啥事了
01/27 21:13, 10F

01/27 21:14, , 11F
你的 sudo 吃不到你下的 PATH
01/27 21:14, 11F

01/27 21:18, , 12F
不過有點好奇有需要用 sudo 嗎? 何不產在 /tmp 再搬過去
01/27 21:18, 12F

01/27 21:20, , 13F
小弟算新手,最近越來越受不了windows的command怒切了點
01/27 21:20, 13F

01/27 21:21, , 14F
空間裝linux,大概用一個禮拜已經愛上了 XD
01/27 21:21, 14F

01/27 21:21, , 15F
最近還在拜讀鳥哥的文章,但其實很多觀念還在建立
01/27 21:21, 15F

01/27 21:22, , 16F
常常用sudo是因為有時候對一些指令還不熟悉,偏偏需要權
01/27 21:22, 16F

01/27 21:22, , 17F
限, 不過我現在還有點茫 因為兩個 PATH是一樣的
01/27 21:22, 17F

01/27 21:26, , 18F
感覺轉換程式應該是不至於用到 sudo 的
01/27 21:26, 18F

01/27 21:27, , 19F
啊 不對 我看錯了一點東西
01/27 21:27, 19F

01/27 21:27, , 20F
path問題解掉了,現在在解令一個執行噴錯 XD
01/27 21:27, 20F

01/27 21:27, , 21F
01/27 21:27, 21F

01/27 21:28, , 22F
現在執行成功了,但原本的檔名encoding問題又回來了
01/27 21:28, 22F

01/27 21:29, , 23F
成功呼叫到xlsx2csv,但是檔名encoding問題跑出來了
01/27 21:29, 23F

01/27 21:33, , 24F
現在是轉完的檔名會亂碼嗎? 還是檔名亂碼導致讀不到檔?
01/27 21:33, 24F

01/27 21:34, , 25F
檔名亂碼導致xlsx2csv在讀檔階段噴錯,我現在在查要怎麼
01/27 21:34, 25F

01/27 21:35, , 26F
在bash裡面做一部分字串的轉碼
01/27 21:35, 26F

01/27 21:36, , 27F
建議用 iconv
01/27 21:36, 27F

01/27 21:38, , 28F
啊 應該是說用 convmv
01/27 21:38, 28F

01/27 21:38, , 29F
先把檔名轉一轉
01/27 21:38, 29F

01/27 21:46, , 30F
下午我在試時 iconv 我撞到xlsx不知道要怎麼處理 QQ
01/27 21:46, 30F

01/27 21:47, , 31F
convmv 是還沒弄懂下法 現在在試 QQ
01/27 21:47, 31F

01/28 00:03, , 32F
有幾個問題確認一下:
01/28 00:03, 32F

01/28 00:04, , 33F
1. 一開始問題,你 script 的變數語法宣告有問題
01/28 00:04, 33F

01/28 00:04, , 34F
PATH=path1:path2:path3 這樣子,= 符號兩邊不可以空白
01/28 00:04, 34F

01/28 00:11, , 35F
2. 你改了 PATH 變數,不一定會讓 sudo 執行時候套用
01/28 00:11, 35F

01/28 00:12, , 36F
不小心按到「噓」的選項 -.-"
01/28 00:12, 36F

01/28 00:12, , 37F
3. sudo 的 PATH 很多解法,一般最簡單可以改目的帳號
01/28 00:12, 37F

01/28 00:13, , 38F
的 shell 設定檔案設定,後續使用 sudo -i 方式來執行
01/28 00:13, 38F

01/28 00:13, , 39F
吃目的身份的 shell 初始化環境設定配置就可以了
01/28 00:13, 39F

01/28 00:15, , 40F
4. 你的當下語系是 zh_tw.Big5 還是 zh_TW.UTF8 呢
01/28 00:15, 40F

01/28 00:15, , 41F
執行 locale 看一下 LANG 與 LC_ALL 變數確認一下
01/28 00:15, 41F

01/28 00:16, , 42F
目前這個年代應該不大會預設使用 zh_TW.Big5 這類編碼
01/28 00:16, 42F

01/28 00:17, , 43F
不過還是可以確認一下比較好確認問題點
01/28 00:17, 43F

01/28 00:17, , 44F
至於樓上其他朋友提到 convmv 主要是解決檔名的編碼
01/28 00:17, 44F

01/28 00:18, , 45F
與所處使用的語系編碼不同的檔案名稱修改工具
01/28 00:18, 45F

01/28 00:18, , 46F
一般大多用於 file server 可能以往是使用 Big5 的編碼
01/28 00:18, 46F

01/28 00:18, , 47F
後續系統預設 locale 改成 utf8 這類,系統的程式要
01/28 00:18, 47F

01/28 00:19, , 48F
能夠正常識別顯示,尤其像是 samba 這類就顯得重要
01/28 00:19, 48F

01/28 00:29, , 49F
感謝兩位大大的講解,我設定是全utf8,convmv我有看過討
01/28 00:29, 49F

01/28 00:29, , 50F
論改檔名的事情,只是我需要的是批量改檔名,所以我還在
01/28 00:29, 50F

01/28 00:31, , 51F
摸索,由於取得資料的資料源全都是萬惡MS的big5,最小單
01/28 00:31, 51F

01/28 00:31, , 52F
位的資料大概都會到30檔案,每個檔案約有數萬比資料
01/28 00:31, 52F

01/28 00:32, , 53F
所以小弟linux新手得越級打怪 QQrz 我是先手動轉檔處理
01/28 00:32, 53F

01/28 00:33, , 54F
很迫切要的前二十多份,但類似的問題我覺得還會遇到所以
01/28 00:33, 54F

01/28 00:33, , 55F
有點越級打怪還是來跟大家請教了 QQ
01/28 00:33, 55F

01/28 00:35, , 56F
雖然可以load到python裡面然後再做轉檔,但我目前試速度
01/28 00:35, 56F

01/28 00:35, , 57F
最快效果最好的方式是直接讓shell叫,用shell default的
01/28 00:35, 57F

01/28 00:36, , 58F
語系跳過python我要處理open read & write的問題直接轉
01/28 00:36, 58F

01/28 00:43, , 59F
不過還是沒看出來你轉檔失敗的主要問題點在哪
01/28 00:43, 59F

01/28 00:44, , 60F
目前你 script 改好程式碼內容怎樣,執行跑有錯誤嗎
01/28 00:44, 60F

01/28 00:44, , 61F
那錯誤訊息要給一下要不然還是有點困惑
01/28 00:44, 61F

01/28 00:45, , 62F
看不出來是 shell script 還是 python script 的問題
01/28 00:45, 62F

01/28 00:46, , 63F
它輸出 xlsx2csv 出現執行錯誤,而執行噴錯內容就是常見
01/28 00:46, 63F

01/28 00:47, , 64F
的big5碼,並表示這些字元在裡面是不允許的,所以我覺得
01/28 00:47, 64F

01/28 00:48, , 65F
是檔名編碼問題,過去傳資料進方法或函數跳此類錯誤都是
01/28 00:48, 65F

01/28 00:48, , 66F
把encoding處理好就解掉了
01/28 00:48, 66F

01/28 00:55, , 67F
所以你系統還是使用 big5 的 locale 環境?
01/28 00:55, 67F

01/28 01:35, , 68F
UTF8是資料源的機構是全面big5+excel,兩個讓我頭大的
01/28 01:35, 68F

01/28 01:36, , 69F
東西,big5 要轉碼 excel會把讀檔時間拉長
01/28 01:36, 69F

01/28 01:36, , 70F
所以我是在系統內直接做轉檔,因為我default是utf8所以
01/28 01:36, 70F

01/28 01:37, , 71F
xlsx2csv會自動幫我轉成utf8
01/28 01:37, 71F

01/28 01:38, , 72F
第一句話沒打好 我是utf8 取資料單位是全面big5
01/28 01:38, 72F

01/28 07:30, , 73F
「which xlsx2csv」看看那東西到底有沒有在你新寫的PATH裡?
01/28 07:30, 73F

01/28 07:31, , 74F
也可以先在script內「source ~/.bashrc」看看能不能正常跟
01/28 07:31, 74F

01/28 07:31, , 75F
terminal一樣動,這個指令就是載入你的.bashrc那些變數
01/28 07:31, 75F

01/28 07:32, , 76F
放在行頭可能有效,不肯定@@
01/28 07:32, 76F

01/28 07:32, , 77F
檔頭第1行
01/28 07:32, 77F

01/28 08:13, , 78F
感謝H大,不過PATH的問題已經解了,現在在解中文檔名編碼
01/28 08:13, 78F
※ 編輯: JackBaska (140.109.196.140), 02/01/2016 17:21:18

02/02 00:32, , 79F
呃 後來查了一下 設定 PATH 的地方不用 sudo
02/02 00:32, 79F

02/02 00:32, , 80F
也不能用 sudo 因為那是 bash 的內建功能 sudo 不吃
02/02 00:32, 80F

02/02 00:32, , 81F
之前那邊誤導到了不好意思 @@
02/02 00:32, 81F

02/02 00:43, , 82F
就只要 PATH=$PATH:~/bin; export PATH; 就可以了
02/02 00:43, 82F

02/02 00:44, , 83F
如果說要確定 sudo 有吃到你前面下的變數用 sudo -E
02/02 00:44, 83F
文章代碼(AID): #1Mg902I5 (Linux)
文章代碼(AID): #1Mg902I5 (Linux)