Dari /unix//a/458074/674
Ingatlah untuk menggunakan
--
saat memberikan argumen arbitrer ke perintah (atau gunakan pengalihan jika memungkinkan). Jadisort -- "$f1"
atau lebih baiksort < "$f1"
daripadasort "$f1"
.
Mengapa lebih disukai untuk digunakan --
dan pengalihan?
Mengapa sort < "$f1"
lebih disukai daripada sort -- "$f1"
?
Mengapa sort -- "$f1"
lebih disukai daripada sort "$f1"
?
Terima kasih.
Jawaban:
gagal untuk nilai
$f1
yang dimulai dengan-
atau di sini untuk kasussort
beberapa yang dimulai dengan+
(dapat memiliki konsekuensi parah untuk file yang dipanggil-o/etc/passwd
misalnya).(di mana
--
menandakan akhir opsi) menangani sebagian besar masalah tersebut tetapi masih gagal untuk file yang dipanggil-
(yangsort
menafsirkan sebagai stdin sebagai gantinya).Tidak memiliki masalah itu.
Di sini, itu shell yang membuka file. Ini juga berarti bahwa jika file tidak dapat dibuka, Anda juga akan mendapatkan pesan kesalahan yang berpotensi lebih berguna (misalnya, kebanyakan shell akan menunjukkan nomor baris dalam skrip), dan pesan kesalahan akan konsisten jika Anda menggunakan pengalihan sedapat mungkin untuk membuka file.
Dan masuk
(bertentangan dengan
sort -- "$f1" > out
), jika"$f1"
tidak dapat dibuka,out
tidak akan dibuat / terpotong dansort
bahkan tidak dijalankan.Untuk menghapus beberapa kebingungan yang mungkin terjadi (mengikuti komentar di bawah), itu tidak mencegah perintah
mmap()
untuk memasukkan file ataulseek()
memasukkannya ke dalam file (tidaksort
juga melakukannya) asalkan file itu sendiri dapat dicari. Satu-satunya perbedaan adalah bahwa file dibuka sebelumnya dan pada deskriptor file 0 oleh shell sebagai lawan kemudian oleh perintah mungkin pada deskriptor file yang berbeda. Perintah masih dapat mencari / mmap fd 0 sesuka hati. Itu tidak menjadi bingung dengan dicat file | cmd
manacmd
stdin kali ini adalah pipa yang tidak dapat dicari / dicari.sumber
sort
untuk membaca data secara berurutan dan Anda tidak dapatmmap
file. Meskipunsort
mungkin tidak memiliki banyak masalah dengan itu, pertimbangkan kinerjaless <file
danless file
. Dalam kasus pertamaless
harus menyimpan seluruh isi file dalam memori, dalam kasus kedua itu diperbolehkan untuk membaca hanya bagian-bagian yang diinginkannya. Sekarang bayangkan itufile
adalah file log 100GB ...less <file
menyimpan semua file dalam memori, tetapi tidak dipaksa, ini adalah kekurangan dari kurang. Hanyacat file | less
terpaksa. Lihatless /dev/fd/0 <f
, yang tidak menyimpan file dalam memori, meskipun ia menerimanya di stdin. Ini adalah kesalahpahaman umum bahwa stdin di Unix tidak dapat dilihat. Faktanya, itu bisa dicari, tergantung pada jenis file.read()
membaca data secara berurutan dari suatu file, sementarammap()
membaca seluruh file ke dalam memori sekaligus?sort
oleh POSIX. Tetapi memang benar bahwa itu tidak selalu didukung.getopt()
fungsi C mengakui pentingnya argumen ini--
. Tetapi poin utama adalah yang Anda terima: penanganan argumen adalah domain dari masing-masing program, dan tidak semua memperlakukan--
secara khusus.Masalahnya adalah nama file yang dimulai dengan tanda hubung.
sort "$f1"
tidak berfungsi jika nilaif1
dimulai dengan-
karena perintah akan menafsirkan nilai sebagai opsi. Ini biasanya menghasilkan kesalahan tetapi bahkan bisa menyebabkan lubang keamanan . Dengansort -- "$f1"
, argumen dasbor ganda--
berarti "tidak ada opsi di luar titik ini" sehingga nilaif1
tidak akan ditafsirkan sebagai opsi. Tetapi masih ada satu kasus tepi: jika nilaif1
adalah tanda hubung dan tidak ada yang lain, maka itu bukan pilihan, itu argumen-
, yang berarti "input standar" (karena argumennya adalah file input; untuk file output itu berarti "output standar").Menggunakan pengalihan menghindari semua jebakan ini.
Ini berlaku untuk sebagian besar perintah, bukan hanya
sort
.sumber
sort < "$f1"
akan berhasil jika nilainya sama dengan-
? Itu tidak dalam shell saya sudah mencoba.seq 10 > -; sort -
denganseq 10 > -; sort < -
.