我有一個bash腳本什麼包含幾個utf-8字符串包含變量。這些變量用作sctript中bash函數的參數,它使用此參數調用cp
和python
腳本。如何修復bash中UTF-8字符串的使用情況?
此腳本在我的機器上正常運行,但無法在另一個上運行。我試圖調試set -x
和其他的東西,但我找不到根本原因,只有這種差異。
有一個minimalized例子 - 像Plunker爲JS)
我有以下
test.sh
#!/bin/bash set -x function aaa() { echo "$1" } echo 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ' aaa 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ'
我複製到我的兩臺主機
好節目如下:
+ echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ öüóőúéáűíÖÜÓŐÚÉÁŰÍ + aaa öüóőúéáűíÖÜÓŐÚÉÁŰÍ + echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ öüóőúéáűíÖÜÓŐÚÉÁŰÍ
然而壞顯示了這個:
+ 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 Precise與bash=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文件編碼不好... 對不起所有的調試幫手!
我不確定你是否真的有問題。兩種情況下的輸出都是正確的;您只是在「壞」主機的調試輸出中獲得了不同的(但有效的)表示。 – chepner
我發現這篇文章http://stackoverflow.com/questions/11838597/bash-echo-with-an-character-outside-the-string - 但不能解決我的問題...... :( –
@chepner the ''cp''找不到源路徑,但這是存在的。 –