Untuk meneruskan nama file yang mengandung spasi ke shell script di macOS, beri tanda kutip pada path sebagai satu argumen saat Anda menjalankan skrip, lalu gunakan "$1" di dalam skrip. Sebagai contoh, ./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf" meneruskan satu nama file; tanpa tanda kutip, shell akan memecahnya menjadi beberapa argumen. Metode ini juga berfungsi untuk path yang mengandung karakter khusus shell lainnya jika diberi tanda kutip dengan benar.
Jalankan skrip dengan path sebagai satu argumen
Di Terminal, tempatkan tanda kutip ganda di sekeliling nama file atau path lengkap, termasuk direktorinya, dan pisahkan dari nama skrip:
./process-file.sh "/Users/sam/Documents/Quarterly Report.pdf"
Garis miring terbalik (backslash) sebelum setiap spasi juga dapat digunakan untuk path sederhana yang diketik: ./process-file.sh /Users/sam/Documents/Quarterly\ Report.pdf. Mengutip seluruh path lebih mudah dibaca dan lebih minim kesalahan, terutama jika terdapat beberapa spasi. Tanda kutip adalah sintaksis shell; tanda ini mengelompokkan path menjadi satu argumen dan bukan merupakan bagian dari nama file yang diterima oleh skrip. Shell melakukan pemisahan kata (word splitting) setelah ekspansi, sehingga path tanpa tanda kutip dapat terpecah pada bagian spasi. Bash Reference Manual: Quoting
Jika file berada di direktori saat ini, path relatif juga dapat digunakan:
./process-file.sh "Quarterly Report.pdf"
Path tersebut harus tetap mengarah ke file yang ada dari direktori tempat Anda menjalankan perintah. Jika skrip itu sendiri tidak dapat dieksekusi, jalankan melalui shell, misalnya bash process-file.sh "/Users/sam/Documents/Quarterly Report.pdf". Kedua format ini meneruskan path sebagai argumen; skrip memerlukan izin baca untuk file tersebut dan harus menangani izin lain yang diperlukan.
Gunakan argumen dengan aman di dalam skrip
Simpan ini sebagai process-file.sh:
#!/bin/bash
if [ "$#" -ne 1 ]; then
printf 'Usage: %s FILE\n' "$0" >&2
exit 2
fi
file=$1
if [ ! -f "$file" ]; then
printf 'Not a regular file: %s\n' "$file" >&2
exit 1
fi
printf 'Received one file: %s\n' "$file"
Skrip ini memeriksa apakah ia menerima tepat satu argumen, memeriksa apakah path tersebut menunjuk ke file reguler, dan mencetak path yang diterima. $# adalah jumlah argumen; $1 adalah argumen pertama. Tetap gunakan tanda kutip pada ekspansi variabel—"$file"—saat meneruskan path ke perintah atau menggunakannya dalam pengujian. Jika tidak, shell dapat memecah nilai yang mengandung spasi menjadi kata-kata terpisah dan memperlakukan karakter wildcard sebagai pola nama file. Manual Bash mendokumentasikan parameter posisional serta langkah-langkah pemisahan kata dan ekspansi nama file oleh shell. Bash Reference Manual: Positional Parameters and Shell Expansions
Untuk memproses beberapa nama file, beri tanda kutip pada setiap path saat memanggil skrip, dan lakukan perulangan (loop) pada "$@" agar setiap argumen tetap terpisah:
for file in "$@"; do
printf 'Received: %s\n' "$file"
done
Jangan gunakan $* atau $@ tanpa tanda kutip untuk tujuan ini: keduanya dapat menggabungkan atau memecah nilai argumen. Jika skrip mengharapkan tepat satu file, pertahankan pemeriksaan satu argumen dan teruskan satu path yang diberi tanda kutip.
Saat AppleScript meluncurkan perintah shell
Perintah AppleScript do shell script menerima string teks yang berisi kode shell. Jika Anda menggabungkan (concatenate) path secara langsung ke dalam perintah tersebut, path seperti /Users/sam/Quarterly Reports/report.pdf akan diinterpretasikan sebagai beberapa kata shell. Apple mendokumentasikan quoted form sebagai cara untuk menghasilkan teks yang aman bagi interpretasi shell, termasuk string yang mengandung spasi dan karakter tanda kutip di dalamnya. Apple: Calling Command-Line Tools
Untuk path yang sudah diketahui, beri tanda kutip dengan quoted form of sebelum menggabungkannya:
set filePath to "/Users/sam/Quarterly Reports/report.pdf"
set safePath to quoted form of filePath
do shell script "/path/to/process-file.sh " & safePath
Perintah yang dihasilkan akan memberikan satu argumen path ke skrip. Jika path berasal dari pemilih file (file chooser), ubah item yang dipilih menjadi path POSIX terlebih dahulu, lalu beri tanda kutip:
set filePath to POSIX path of (choose file)
do shell script "/path/to/process-file.sh " & quoted form of filePath
Referensi AppleScript dari Apple memperagakan pola ini untuk folder yang dipilih dan mencatat bahwa quoted form juga menangani tanda kutip tunggal di dalam string. AppleScript Language Guide: Commands Reference
Memperbaiki kegagalan umum
Jika skrip melaporkan bahwa ia menerima beberapa argumen, periksa perintah yang menjalankannya: path lengkap harus berada di dalam satu pasang tanda kutip. Jika skrip menerima path dengan tanda kutip literal, periksa apakah tanda tersebut disertakan dalam string nama file itu sendiri; tanda kutip shell seharusnya berfungsi mengelompokkan argumen, bukan menjadi bagian dari nilainya.
Jika skrip menerima path dengan benar tetapi perintah selanjutnya gagal, periksa juga argumen perintah tersebut. Memberi tanda kutip pada perintah peluncuran tidak otomatis mengamankan variabel tanpa tanda kutip di dalam skrip: gunakan format seperti some-command "$file". Untuk AppleScript, jangan menambahkan tanda kutip di sekitar path secara manual; gabungkan quoted form of dari path ke perintah shell. Langkah ini hanya mengatasi penguraian (parsing) shell. Cara ini tidak membuat path yang tidak valid menjadi ada, tidak memberikan izin akses file, atau menjamin bahwa program yang dipanggil dapat menerima file tersebut.
Sumber
Bash Reference Manual: Quoting — GNU Project
Bash Reference Manual — GNU Project
Mac Automation Scripting Guide: Calling Command-Line Tools — Apple
Commands Reference — Apple