Di Mac, letakkan pola wildcard di dalam tanda kutip tunggal untuk mencegah shell zsh default mengekspansinya sebelum perintah dijalankan. Misalnya, printf '%s\n' '*.csv' meneruskan teks harfiah *.csv sebagai satu argumen. Tanda kutip dihapus oleh shell; tanda bintang sampai ke program. Jika program itu sendiri menggunakan pola, program tersebut mungkin menginterpretasikan tanda bintang itu setelahnya.
Mengapa wildcard berubah sebelum perintah berjalan
Ketika Anda memasukkan perintah di Terminal, shell memproses argumen-argumennya sebelum memulai program. Di zsh, tanda * tanpa tanda kutip dapat memicu pembuatan nama file (filename generation): shell mengganti pola tersebut dengan nama-nama file yang cocok. Jika tidak ada kecocokan, zsh biasanya melaporkan kesalahan, meskipun opsi shell dapat mengubah perilaku tersebut. Manual zsh menjelaskan pembuatan nama file dan perilaku tanpa kecocokan.
Apple menetapkan zsh sebagai shell default di Terminal, meskipun Mac dapat dikonfigurasi untuk menggunakan shell lain. Panduan Terminal Apple menjelaskan shell default dan cara mengubahnya. Metode tanda kutip tunggal di bawah ini cocok untuk zsh dan Bash; jika Anda menggunakan shell yang berbeda, periksa manualnya karena aturan tanda kutip dapat bervariasi.
Gunakan tanda kutip tunggal untuk wildcard harfiah
Ketik pola wildcard di antara tanda kutip tunggal, dengan tetap mempertahankan karakter lain yang menjadi bagiannya. Misalnya:
printf '%s\n' '*.csv'
Outputnya adalah *.csv secara harfiah, terlepas dari apakah direktori saat ini berisi file CSV atau tidak. printf menerima pola tersebut sebagai argumen dan mencetaknya; shell tidak mengekspansi tanda bintang. Tanda kutip merupakan sintaksis shell, sehingga tidak disertakan dalam argumen. Panduan shell scripting Apple menjelaskan bahwa tanda kutip tunggal menonaktifkan ekspansi shell di dalam teks yang dikutip. Apple: Flow Control, Expansion, and Parsing.
Hal ini sangat penting ketika sebuah program memang dirancang untuk menangani pola itu sendiri. Di macOS, misalnya, find dapat mencocokkan nama file menggunakan pola yang diberikan ke -name:
find . -type f -name '*.log'
Di sini, shell meneruskan *.log secara harfiah ke find; kemudian find menerapkan pencocokan nama filenya sendiri ke file-file di bawah direktori saat ini. Memberi tanda kutip mencegah shell mengganti pola dengan nama-nama file di direktori saat ini sebelum find dapat menggunakannya. Arti pola tersebut bergantung pada program penerima: tanda kutip shell mengontrol ekspansi shell, bukan cara program menginterpretasikan argumennya.
Kapan harus menggunakan garis miring terbalik (backslash)
Untuk pola yang pendek, garis miring terbalik (backslash) dapat melindungi wildcard individual di luar tanda kutip:
printf '%s\n' \*.csv
Cara ini juga meneruskan tanda bintang secara harfiah. Tanda kutip tunggal sering kali lebih mudah dibaca ketika suatu pola berisi beberapa karakter khusus, spasi, atau tanda kurung siku. Sebagai contoh, 'chapter [0-9]*.txt' menjaga tanda kurung siku dan wildcard agar tidak diinterpretasikan oleh shell. Apple mendokumentasikan penggunaan backslash dan perilaku tanda kutip tunggal dalam panduan shell scripting miliknya.
Kesalahan tanda kutip yang umum terjadi
Tanda kutip ganda tidak secara andal melindungi setiap karakter shell. Tanda tersebut memang mencegah ekspansi wildcard di zsh, namun tetap mengizinkan ekspansi tertentu, termasuk variabel seperti $name dan substitusi perintah seperti $(command). Untuk pola yang harus diterima persis seperti yang diketik, gunakan tanda kutip tunggal kecuali jika argumen tersebut memang memerlukan salah satu dari ekspansi tersebut.
Tanda kutip tunggal tidak dapat muncul di dalam string bertanda kutip tunggal sebagai karakter biasa. Jika pola itu sendiri berisi apostrof, tutup bagian yang dikutip, tambahkan apostrof menggunakan metode tanda kutip lain, lalu buka kembali tanda kutip tunggal; Apple menunjukkan teknik tanda kutip shell ini dalam panduannya. Untuk pola yang tidak biasa, periksa perintah secara teliti sebelum menjalankannya.
Bedakan juga antara ekspansi shell dan perilaku program penerima. Mengutip *.log tidak memaksa program untuk memperlakukan tanda bintang sebagai karakter biasa; ini hanya memastikan shell meneruskannya apa adanya. Utilitas seperti find -name dapat menginterpretasikannya sebagai pola, sementara perintah lain mungkin memperlakukannya secara harfiah. Periksa dokumentasi perintah itu sendiri jika perbedaan ini penting.
Pemeriksaan cepat sebelum menekan Return
Tanyakan apa yang seharusnya diterima oleh program. Jika membutuhkan pola wildcard, tempatkan pola tersebut di dalam tanda kutip tunggal dan pastikan opsi perintah diatur untuk menginterpretasikan pola sebagaimana mestinya. Jika program seharusnya menerima nama file yang sebenarnya, biarkan ekspansi shell tetap aktif jika sesuai, atau berikan nama file tersebut secara langsung. Kuncinya adalah memberikan tanda kutip pada batas shell ketika Anda ingin program menerima karakter wildcard itu sendiri.
Sumber
14 Expansion (zsh) — zsh.sourceforge.io
Ubah shell default di Terminal di Mac — Dukungan Apple
Flow Control, Expansion, and Parsing — Apple Developer