Pertanyaan Apakah ada pathname POSIX yang tidak bisa menyebutkan nama file?


Apakah ada jalur hukum di POSIX yang tidak dapat dikaitkan dengan file, teratur atau tidak teratur? Yaitu, untuk yang mana test -e "$LEGITIMATEPOSIXPATHNAME" tidak bisa berhasil?

Klarifikasi # 1: nama path 

Dengan "jalur hukum di POSIX", maksud saya yang dikatakan POSIX diizinkan, bukan yang POSIX tidak secara eksplisit dilarang. Saya telah melihat ini, dan spesifikasi POSIX memanggil mereka string karakter yang:

  1. Gunakan hanya karakter dari set karakter nama file portabel [a-zA-Z0-9._-] (lih. http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_276);
  2. Jangan mulai dengan -; dan
  3. Memiliki panjang antara 1 dan NAME_MAX, angka yang tidak ditentukan untuk POSIX yang tidak kurang dari 14.

POSIX juga memungkinkan filesystem itu mungkin akan lebih rileks daripada ini, tetapi ia melarang karakter NUL dan / dari tampil dalam nama file. Perhatikan bahwa nama file UNIX paradigmatik sebagai lost+found bukan FPF, menurut def ini. Ada PATH_MAX konstan lainnya, yang penggunaannya tidak memerlukan penjelasan lebih lanjut.

Jawaban yang ideal akan menggunakan FPF, tapi saya tertarik pada contoh apa pun dengan nama file yang tidak dilarang secara tegas oleh POSIX.

Klarifikasi # 2: tidak mungkin

Jelas, nama path biasanya bisa diikat ke file. Tetapi semantik UNIX akan memberi tahu Anda bahwa ada tempat-tempat khusus yang biasanya tidak bisa membuat file acak, seperti di /dev direktori. Apakah ada tempat khusus yang ditetapkan di POSIX? Itulah yang menjadi pertanyaannya.


4
2018-01-14 11:59


asal


Hmmm, saya bertanya-tanya apakah judul itu tidak bisa lebih deskriptif, tetapi apa pun yang saya hasilkan tampaknya menghasilkan kontradiksi dalam istilah ... - Arjan
judul yang jauh lebih baik, terima kasih. - quack quixote
Sekedar catatan ... bukan itu / nya. Di Unix \ adalah karakter yang bagus untuk memiliki dalam file. / user / chuck / tom \ mary the filename = tom \ mary. - DrFloyd5
@DrFloyd: Benar. Tetap. - Charles Stewart
Saya suka pertanyaan ini. Ini mengingatkan saya pada "Der Mouse", ketika pindah dari VMS ke UNIX, menjadi kesal karena dia tidak dapat menemukan cara untuk membuat nama file dengan garis miring atau nol di dalamnya - di mana garis miring adalah bagian dari nama file dalam direktori, daripada pemisah antara direktori dan sesuatu di direktori. // API POSIX standar tidak menghasilkan kesalahan pada nama file tersebut, mereka hanya menginterpretasikan karakter khusus yang ditanamkan sebagai salah satu jalur terpisah atau string terminator. - Krazy Glew


Jawaban:


Karena pertanyaan terakhir adalah apakah ada tempat khusus yang biasanya tidak memiliki file, seperti di direktori / dev yang ditetapkan di POSIX, maka andswer adalah IYA NIH.

Daftar lengkap file dan direktori yang ditentukan sebelumnya diberikan dalam bab 10, Struktur dan Perangkat Direktori POSIX, dari IEEE Open Group Base Spesifikasi Masalah 6:

Direktori berikut harus ada   pada sistem yang sesuai dan menyesuaikan   aplikasi harus memanfaatkannya   hanya seperti yang dijelaskan. Benar-benar sesuai   aplikasi tidak akan mengasumsikan   kemampuan untuk membuat file di mana saja   direktori ini, kecuali ditentukan   di bawah.

/
      Direktori root.
  / dev
      Berisi / dev / console, / dev / null, dan / dev / tty, dijelaskan di bawah ini.

Direktori berikut harus ada di   sistem yang sesuai dan harus digunakan   seperti yang dijelaskan:

/ tmp
      Direktori yang tersedia untuk aplikasi yang membutuhkan tempat   buat file sementara. Aplikasi   diizinkan untuk membuat file di   direktori ini, tetapi tidak boleh berasumsi   file seperti itu dipertahankan antara   panggilan dari aplikasi.

File-file berikut harus ada di   sistem yang sesuai dan harus keduanya   dapat dibaca dan ditulis:

/ dev / null
      Sumber data dan sumber data tak terbatas. Data ditulis ke / dev / null seharusnya   dibuang. Membaca dari / dev / null   akan selalu mengembalikan file akhir   (EOF).
  / dev / tty
      Dalam setiap proses, sinonim untuk terminal pengendali yang terkait dengan   kelompok proses dari proses itu, jika   apa saja. Ini berguna untuk program atau   prosedur shell yang ingin memastikan   menulis pesan ke atau membaca data   dari terminal tidak peduli seberapa hasilnya   telah dialihkan. Itu juga bisa   digunakan untuk aplikasi yang menuntut   nama file untuk keluaran, saat diketik   output diinginkan dan itu melelahkan   untuk mengetahui apa terminal saat ini   digunakan.

File berikut harus ada di   menyesuaikan sistem dan tidak perlu   dapat dibaca atau ditulis:

/ dev / console
      File / dev / console adalah nama umum yang diberikan ke konsol sistem (lihat   Konsol Sistem). Biasanya terhubung   ke khusus yang ditentukan oleh implementasi   mengajukan. Ini akan menyediakan antarmuka untuk   konsol sistem yang sesuai dengan   persyaratan dari Definisi Dasar   volume IEEE Std 1003.1-2001,   Bab 11, Terminal Umum   Antarmuka.


3
2018-01-21 19:26



Saya berasumsi bahwa istilah "file" juga termasuk direktori, jadi dalam contoh Anda, sebuah program POSIX juga tidak dapat berasumsi bahwa itu dapat membuat direktori bernama "tidak mungkin". Terminologi yang digunakan agak membingungkan, dan saya menganggap penulis tidak membayangkan bahwa / dev dapat berisi direktori. - harrymc
/dev dapat dan biasanya memang berisi direktori: SunOS telah memiliki fsfs mount di /dev/fd selama berabad-abad, dan disalin oleh UNIX paling modern. Tapi POSIX melarang file dari menjadi karakter khusus dan direktori, jadi tidak ada apa-apa di bawah /dev/tty. Jadi dipilih: Saya punya jawaban saya. - Charles Stewart


Pengujian untuk nama file dengan karakter null di dalamnya harus selalu gagal.

Cadangan POSIX '/' dan nol dari nama file. Ini masuk akal: satu adalah pemisah direktori, dan yang satu adalah string terminator. Untuk mendukung titik itu, Wikipedia mengatakan ext2, ext3, dan ext4 memungkinkan semua byte dalam nama file kecuali null dan garis miring. NTFS, apakah dalam mode kompatibilitas POSIX atau tidak, tidak mengizinkan lebih dari itu; dan varian FAT juga melarang nol. Secara teori, itu benar-benar tergantung pada sistem file. Tapi aku tidak akan menahan napas mencoba menemukan kasus di mana null menemukan jalannya ke nama file.


3
2018-01-18 11:21



Memberi +1 untuk jawaban yang membuat saya mencari sesuatu. POSIX melarang "/" dan NUL dalam nama file. Cf. pertanyaan saya postscript. - Charles Stewart


/dev/null/impossible tidak bisa ada. Hal ini karena /dev/null harus berupa file, sehingga tidak dapat berupa direktori.

Sama untuk /dev/tty/impossible dan /dev/console/impossible


2
2017-11-16 05:38





"Jalur hukum dalam POSIX" sudah berarti bahwa itu dapat menunjuk ke objek filesystem (file, direktori, symlink, dll).

Pada pemikiran kedua, beberapa filesystem (seperti FAT) memiliki batasan pada karakter yang diperbolehkan dalam nama file. Jadi di komputer saya, ~/fs/phone/This:is*a?file|name.txt akan ditolak oleh vfat driver filesystem.


Untuk menjawab pertanyaan kedua, test -e "$LEGITIMATEPOSIXPATHNAME" gagal ketika file tidak ada, jelas.


1
2018-01-14 14:04



Hehe, +1 untuk paragraf terakhir. Ada jawaban untuk pertanyaan apa pun, saya kira. :-) - Arjan
s / gagal / tidak berhasil / - Charles Stewart
Saya tidak akrab dengan * nix mana /dev/fd/this-is-not-a-file bisa berupa file, tetapi IIUC, POSIX tidak mengatakan itu tidak bisa menjadi file. Jadi jalur hukum di POSIX tidak berarti OS POSIX-compliant harus mengizinkan file yang akan dibuat di sana. - Charles Stewart
-1: Benar-benar kehilangan poin pertanyaan. - Charles Stewart
@Charles, itu agak mengejutkan saya bahwa Anda tidak mau berpikir sementara saya pikir pertanyaan Anda tidak jelas sama sekali. (Dan masih memiliki gelar yang sangat buruk, yang sama sekali bukan pertanyaan - superuser.com/faq) - Arjan


Tes akan gagal jika nama file melanggar batasan dari implementasi lokal POSIX.

Setiap sistem file yang ada membuat asumsi tentang panjang maksimum, batas rekursif direktori dan banyak lagi. Jadi nama POSIX yang legal pada satu sistem operasi mungkin tidak sah di satu sistem operasi.

Jadi jawaban saya untuk pertanyaan itu adalah "Ya":
Bahkan nama-nama yang legal ketika diuji pada satu sistem POSIX, dapat ditolak oleh yang lain, karena pembatasan implementasi.


0
2018-01-18 13:23



Setiap pathname yang dikatakan POSIX legal diterima pada semua sistem file yang kompatibel dengan POSIX, berdasarkan definisinya. Ini yang aku pedulikan. - Charles Stewart
Nah, NAME_MAX dan PATH_MAX tergantung pada penerapan. Saya pikir Anda bertentangan dengan diri Anda ketika Anda bertanya (1) untuk nama file POSIX yang tidak dapat dicapai, dan pada saat yang sama (2) diterima pada semua sistem POSIX-compliant. Menurut definisi, nama file yang dapat diterima tidak dapat dicapai, dan penyebut terkecil dari semua sistem POSIX selalu dapat dicapai pada semuanya. - harrymc
Aha! Tidak, saya ingin nama path yang akan berfungsi, kecuali asumsi lain dalam POSIX mencegah file dari yang ada - Charles Stewart