2015-10-22 21 views
0

我有一個bash腳本什麼包含幾個utf-8字符串包含變量。這些變量用作sctript中bash函數的參數,它使用此參數調用cppython腳本。如何修復bash中UTF-8字符串的使用情況?

此腳本在我的機器上正常運行,但無法在另一個上運行。我試圖調試set -x和其他的東西,但我找不到根本原因,只有這種差異。

有一個minimalized例子 - 像Plunker爲JS)

  1. 我有以下test.sh

    #!/bin/bash 
    set -x 
    
    function aaa() { 
        echo "$1" 
    } 
    echo 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ' 
    aaa 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ' 
    
  2. 我複製到我的兩臺主機

  3. 好節目如下:

    + echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    + aaa öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    + echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    
  4. 然而壞顯示了這個:

    + echo $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215' 
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    + aaa $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215' 
    + echo $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215' 
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ 
    

這裏是調試的一些細節:

良好的工作機是Ubuntu的忠實的bash=4.2-2ubuntu2.6,和壞的工作機是Ubuntu Precisebash=4.3-7ubuntu1.5

locale S IN兩臺計算機是相同的:

$ locale                                                               
LANG=en_US.UTF-8 
LANGUAGE= 
LC_CTYPE=en_US.UTF-8 
LC_NUMERIC=en_US.UTF-8 
LC_TIME=en_US.UTF-8 
LC_COLLATE=en_US.UTF-8 
LC_MONETARY=en_US.UTF-8 
LC_MESSAGES=POSIX 
LC_PAPER=en_US.UTF-8 
LC_NAME=en_US.UTF-8 
LC_ADDRESS=en_US.UTF-8 
LC_TELEPHONE=en_US.UTF-8 
LC_MEASUREMENT=en_US.UTF-8 
LC_IDENTIFICATION=en_US.UTF-8 
LC_ALL= 

更新

  • 我是錯的cp,對不起。
  • 我想,蟒蛇異常沒有在這種情況下,相關的,因爲它是在慶典打破。這種回溯可以幫助什麼?

    + /tmp/callrecord-renamer.py --skip --contacts $'/var/datastore/T\303\274nci/Rendszer/DropboxClone/contacts.ini' $'/var/datastore/T\303\274nci/DropboxClone/H\303\215V\303\201SFELV\303\211TELEK' 
    Traceback (most recent call last): 
        File "/tmp/callrecord-renamer.py", line 316, in <module> 
        main() 
        File "/tmp/callrecord-renamer.py", line 312, in main 
        FileManager(args.recording_path, contacts_path, args.no_change, args.skip_errors).update_files_in_directory() 
        File "/tmp/callrecord-renamer.py", line 87, in update_files_in_directory 
        self.contacts.load() 
        File "/tmp/callrecord-renamer.py", line 56, in load 
        self.database.read(self.file_path) 
        File "/usr/lib/python3.2/configparser.py", line 689, in read 
        self._read(fp, filename) 
        File "/usr/lib/python3.2/configparser.py", line 994, in _read 
        for lineno, line in enumerate(fp, start=1): 
        File "/usr/lib/python3.2/codecs.py", line 300, in decode 
        (result, consumed) = self._buffer_decode(data, self.errors, final) 
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 3176: invalid start byte 
    

欲瞭解更多詳情,您可以檢查此文件:https://github.com/andras-tim/callrecord-renamer/blob/master/callrecord-renamer.py

UPDATE2

我已經檢查:此錯誤慶典代碼獨立造成的。 .ini文件編碼不好... 對不起所有的調試幫手!

+1

我不確定你是否真的有問題。兩種情況下的輸出都是正確的;您只是在「壞」主機的調試輸出中獲得了不同的(但有效的)表示。 – chepner

+0

我發現這篇文章http://stackoverflow.com/questions/11838597/bash-echo-with-an-character-outside-the-string - 但不能解決我的問題...... :( –

+0

@chepner the ''cp''找不到源路徑,但這是存在的。 –

回答

2

您正在比較set -x的xtrace調試輸出。你不能也不應該期望bash的xtrace輸出處於某種格式。如果你想要一個特定的格式,你需要自己製作。

如果你看看你的腳本的非調試輸出,它在兩臺機器上都是一樣的。

+0

我在調試** bash **幾年前的代碼,但直到現在我纔看到這個從''set -x''轉義。 - 我在指責編碼,因爲現在我已經檢查了第三臺機器(這也是Precise),這個腳本在那裏工作。 –

相關問題