Saya tidak sengaja membuat file dengan nama -
(misalnya, seq 10 > -
). Kemudian saya mencoba menggunakannya less
untuk melihatnya, tetapi hanya hang.
Saya mengerti bahwa ini terjadi karena less -
mengharapkan input dari stdin
, sehingga tidak menafsirkan -
sebagai nama file. Saya mencoba less \-
tetapi tidak berhasil juga.
Jadi, apakah ada cara untuk menunjukkan less
bahwa itu -
adalah file dan bukan stdin?
Yang terbaik yang bisa saya dapatkan adalah:
find -name '-' -exec less {} +
-
sendirian berbeda.-
bukan pilihan.-
tidak diperlakukan sebagai opsi, itu masalah yang sama sekali berbeda dari kasus argumen yang berbentuk seperti opsi.-
antara tanda kutip tunggal suka'-'
atau keluar seperti itu\-
karena-
bukan karakter khusus untuk shell umum (setidaknya yang sesuai dengan POSIX). Hasilnya sama.Jawaban:
Awali saja dengan
./
:Atau gunakan redirection:
Perhatikan bahwa karena
-
(sebagai lawan-x
atau--foo--
misalnya) dianggap sebagai nama file khusus daripada opsi, berikut ini tidak berfungsi:sumber
find -name '-' -exec less {} +
berjalan.-
dan./-
(atau/path/to/-
atau../to/-
) adalah dua (4) jalur yang valid ke-
file itu, tetapi-
argumen khusus untukless
(berarti membaca dari stdin) sementara./-
tidak istimewa.find -name '-' -exec less {} +
adalah bentuk non-standar untukfind . -name '-' -exec less {} +
. Itu turun pohon di.
dan menemukan file dan melewati path file tersebut sebagai argumenless
. Ganti-exec less
dengan-exec echo less
untuk melihat apa yang sedang dijalankan.--
adalah untuk menandai akhir opsi. Ini tidak akan membantu di sini. Itu-
bukan opsi, itu argumen non-opsi khusus. Lihat juga unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
ditangani oleh getopt () untuk menandai akhir opsi,-
tidak dikenali sebagai opsi oleh getopt (), sehingga-
akan dikenali sebagai argumen normal apakah--
disediakan atau tidak. Dan sebagai argumen normal,less
seperti kebanyakan utilitas teks akan memperlakukannya sebagai makna stdin, yang tidak kita inginkan di sini.Saya hanya akan
mv - f && less f
. Masalah terpecahkan.sumber
Catatan: jawaban saya BUKAN valid dalam kasus OP, dan hanya berlaku untuk alat yang mengikuti konvensi yang disebutkan di bawah ini dan tidak dalam kasus file bernama persis saja
-
(tanda hubung), yang sering juga merupakan kasus khusus untuk menentukan bacaan dari standar input diharapkan. Lihat jawaban yang diterima.Meninggalkan ini di sini karena berisi informasi yang berguna untuk kasus-kasus lain yang mungkin seseorang temukan ketika mencari jawaban.
Dash dua kali!
Gunakan
--
konvensi dasbor ganda standar ( ) untuk menunjukkan argumen terakhir:Contoh
Apa?
--
Argumen ini berasal dari konvensi yang didukung oleh sebagian besar implementasi utilitas shell dan alat baris perintah, dan sebagian besar shell akan menganjurkan agar Anda harus mengikutinya ketika mengimplementasikan alat CLI.Direkomendasikan oleh Grup Terbuka
OpenGroup juga menyebutkannya di bagian Default deskripsi utilitas (v6) dari Spesifikasi Dasarnya :
Dan dalam Pedoman Sintaks Utilitas (v7):
Direkomendasikan oleh Bash
Di sini, disarikan dari manual bash, tentang bawaannya yang mendukungnya:
Bacaan Tambahan
sumber
-
yang bukan merupakan pilihan. Menggunakan./-
atau redirection bila memungkinkan umumnya pendekatan yang lebih baik karena menghindari jenis lain dari masalah sepertifoo=bar
dariawk
atau yang-
. Lihat juga unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
akan tetap mencoba membaca dari stdin.