Terima kasih @jdt atas jawaban Anda.
Setelah itu, dan karena saya terus mengalami masalah dengan carriage return, saya menulis skrip kecil itu. Hanya jalankan carriage_return
dan Anda akan diminta untuk "membersihkan" file tersebut.
https://Gist.github.com/kartonnade/44e9842ed15cf21a3700
alias carriage_return=remove_carriage_return
remove_carriage_return(){
# cygwin throws error like :
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile
read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'
# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean
# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean
eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file
eval 'rm '$temp_file_to_clean
}
Ini bisa menjadi masalah penyandian file.
Saya mengalami masalah penyandian jenis file saat mengerjakan file antara sistem operasi dan editor yang berbeda - dalam kasus saya khususnya antara sistem Linux dan Windows.
Saya sarankan untuk memeriksa penyandian file Anda untuk memastikannya cocok untuk lingkungan linux target. Saya kira masalah penyandian lebih kecil kemungkinannya karena Anda menggunakan MAC dibandingkan jika Anda menggunakan editor teks Windows, namun menurut saya penyandian file masih layak dipertimbangkan.
--- EDIT (Tambahkan solusi aktual seperti yang direkomendasikan oleh @Potatoswatter)
Untuk mendemonstrasikan bagaimana pengkodean tipe file bisa menjadi masalah ini, saya menyalin/menempel skrip contoh Anda ke Notepad di Windows (saya tidak memiliki akses ke Mac), lalu menyalinnya ke mesin linux dan menjalankannya:
[email protected]:~/windows> sh ./originalfile
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {
Dalam hal ini, Notepad menyimpan file dengan carriage return dan linefeeds, menyebabkan kesalahan yang ditunjukkan di atas. \r
menunjukkan carriage return (sistem Linux mengakhiri baris dengan umpan baris \n
hanya).
Pada mesin linux, Anda dapat menguji teori ini dengan menjalankan perintah berikut untuk menghapus carriage return dari file, jika ada:
cat originalfile | tr -d "\r" > newfile
Kemudian coba jalankan file baru sh ./newfile
. Jika ini berhasil, masalahnya adalah carriage return sebagai karakter tersembunyi.
Catatan: Ini bukan replikasi yang tepat dari lingkungan Anda (saya tidak memiliki akses ke Mac), namun menurut saya masalahnya adalah bahwa editor, di suatu tempat, kereta yang disimpan kembali ke dalam file.
--- /EDIT
Untuk menguraikan sedikit, sistem operasi dan editor dapat memiliki default pengkodean file yang berbeda. Biasanya, aplikasi dan editor akan memengaruhi pengkodean tipe file yang digunakan, misalnya, menurut saya Microsoft Notepad dan Notepad++ default ke Windows-1252. Mungkin ada perbedaan baris baru yang perlu dipertimbangkan juga (Di lingkungan Windows, carriage return dan linefeed sering digunakan untuk mengakhiri baris dalam file, sedangkan di Linux dan OSX, biasanya hanya Linefeed yang digunakan).
Pertanyaan dan jawaban serupa yang mereferensikan penyandian file ada di sini:karakter buruk muncul dalam eksekusi skrip bash
coba sesuatu seperti
$ sudo apt-get install dos2unix
$ dos2unix offendingfile
Cara mudah mengonversi example.sh
file ke UNIX
jika Anda bekerja di Windows menggunakan NotePad++ (Edit>Konversi EOL>Format UNIX/OSX)
Anda juga dapat mengatur EOL default di notepad++ (Pengaturan>Preferensi>Dokumen Baru/Direktori Default>pilih Unix/OSX di bawah kotak Format)