Jika skrip yang disalin dari Windows terlihat normal tetapi macOS melaporkan “bad interpreter” atau berperilaku seolah-olah perintah memiliki karakter tambahan, periksa akhir baris CRLF Windows. Alat baris perintah macOS memerlukan LF. Anda dapat mengonfirmasi jenis file, mengonversi salinannya dengan alat yang sudah ada di macOS, lalu menjalankan skrip yang telah diperbaiki lagi.

Mengapa akhir baris merusak skrip di macOS

Akhir baris (line ending) adalah sebuah karakter (atau pasangan karakter) yang menandai akhir dari suatu baris teks. Alat baris perintah macOS menggunakan LF (\n); Windows umumnya menggunakan CRLF (\r\n). Dengan CRLF, carriage return dapat tetap menempel pada baris saat perintah Unix membacanya. Apple mendokumentasikan bahwa karakter tambahan ini dapat menyebabkan perilaku tak terduga pada alat baris perintah dan skrip. Panduan shell scripting Apple

Petunjuk umum mencakup /bin/bash^M: bad interpreter, pesan command-not-found yang tampak menyertakan akhiran \r, atau penguraian (parsing) yang gagal meskipun skrip yang terlihat tampak benar. Gejala-gejala ini dapat memiliki penyebab lain; memeriksa file merupakan langkah awal yang berguna, bukan bukti mutlak tersendiri.

Periksa format akhir baris skrip

Buka Terminal, masuk ke folder yang berisi skrip tersebut, dan periksa dengan file. Beri tanda kutip pada nama file agar spasi dan metakarakter shell diperlakukan secara harfiah:

cd "$HOME/Downloads"
file "my script.sh"

Jika output menyatakan bahwa file memiliki terminator baris CRLF, hal itu mendukung diagnosis tersebut. Jika laporannya LF, akhir baris mungkin bukan penyebabnya. Deskripsi perintah file di macOS dapat bervariasi, dan akhir baris yang bercampur mungkin tidak diringkas dengan jelas, jadi gunakan juga pesan kesalahan dan konteks sumber skrip. Untuk memeriksa bita (byte) baris tertentu, macOS juga menyertakan od; contohnya:

od -An -tx1 -c "my script.sh" | head

Urutan 0d 0a merepresentasikan CRLF; 0a saja adalah LF. Jangan anggap carriage return di tempat lain dalam file sebagai akhir baris tanpa memeriksa posisinya.

Konversi CRLF ke LF tanpa menimpa file asli

Panduan macOS dari Apple mencatat bahwa dos2unix tidak disertakan dalam macOS dan merekomendasikan penggunaan tr atau sed sebagai gantinya. Untuk skrip CRLF, hapus karakter carriage-return ke dalam file terpisah, dengan tetap menyimpan file asli sebagai cadangan:

cp -p "my script.sh" "my script.sh.bak"
tr -d '\r' < "my script.sh" > "my script.lf.sh"
file "my script.lf.sh"

Langkah ini tepat jika carriage return yang tidak diinginkan adalah karakter akhir baris Windows. Cara ini menghapus setiap bita CR di dalam file, jadi hindari jika file tersebut memang sengaja menggunakan carriage return sebagai data. Output terpisah juga mencegah pemotongan (truncating) input: mengarahkan output secara langsung kembali ke file yang sama dapat menghapusnya sebelum konversi selesai.

Tinjau file baru sebelum mengganti apa pun. Jika isinya terlihat benar dan file melaporkan akhir baris LF, coba jalankan dengan interpreter yang dimaksud. Untuk skrip Bash, misalnya:

bash "my script.lf.sh"

Menjalankannya melalui bash tidak memerlukan bit izin eksekusi atau shebang yang berfungsi. Jika Anda perlu menjalankannya langsung sebagai ./my script.lf.sh, jadikan file tersebut dapat dieksekusi dan pastikan baris pertamanya menyebutkan interpreter yang tersedia, seperti #!/bin/bash:

chmod +x "my script.lf.sh"
"./my script.lf.sh"

Setelah Anda memeriksa file yang diperbaiki, Anda dapat mengganti file asli di Finder atau Terminal. Simpan salinan .bak hingga skrip berfungsi seperti yang diharapkan. Jika skrip adalah bagian dari proyek bersama, lakukan perbaikan akhir baris yang sama di editor sumber atau alur kerja repositorinya agar masalah tidak terulang saat file disimpan kembali.

Jika kesalahan masih berlanjut

Jika file sudah menunjukkan LF, atau konversi tidak memperbaiki kegagalan, baca kesalahan secara tepat dan periksa interpreter yang dinamai pada baris pertama. Interpreter yang hilang, jalur yang tidak valid, kesalahan sintaksis, atau kurangnya izin eksekusi dapat menghasilkan kegagalan serupa. Skrip mungkin juga bergantung pada perintah atau fitur shell yang tidak tersedia di interpreter yang ditentukannya.

TextEdit dapat membuka dan menyimpan dokumen teks biasa, tetapi panduan TextEdit yang didokumentasikan Apple tidak menjelaskan adanya pemilih akhir baris. Untuk perbaikan ini, gunakan konversi Terminal di atas atau editor kode yang secara eksplisit menampilkan dan memungkinkan Anda mengubah akhir baris; verifikasi file yang disimpan sesudahnya. Panduan TextEdit Apple

Urutan langkah yang berguna adalah: identifikasi format file, simpan cadangan, konversi hanya jika CRLF ada, dan jalankan kembali menggunakan interpreter yang dimaksud. Cara ini menjaga perbaikan tetap spesifik pada file tersebut alih-alih mengubah skrip lain yang tidak terkait.

Sumber