Di Linux, apakah ada cara agar skrip shell memeriksa apakah input standarnya dialihkan dari perangkat nol (1, 3) * , idealnya tanpa membaca apa pun?
Perilaku yang diharapkan adalah:
./checkstdinnull
-> no
./checkstdinnull < /dev/null
-> yes
echo -n | ./checkstdinnull
-> no
EDIT
mknod secretunknownname c 1 3
exec 6<secretunknownname
rm secretunknownname
./checkstdinnull <&6
-> yes
Saya kira saya "hanya" perlu membaca nomor maj / min dari perangkat input . Tetapi saya tidak dapat menemukan cara untuk melakukan itu dari shell.
* Tidak perlu adil
/dev/null
, tetapi perangkat null apa pun meskipun dibuat secara manual mknod
.
/dev/null
, atau hanya saja itu bukan tty?{ readlink -f /dev/stdin; } <&6
untuk kasus di mana Anda menggunakan exec dan menghapus node/root/secretunknownname (deleted)
. Karena ini menunjukkan bahwa file terhapus: Apakah itu tidak cukup untuk apa yang Anda butuhkan?stat
solusinya adalah satu-satunya yang berfungsi./dev/null
, tetapi tidak perlu. Anda dapat "alias" denganmknod
huruf s yang diilustrasikan dalam contoh saya.Jawaban:
Di linux, Anda dapat melakukannya dengan:
Di linux tanpa stat (1) (mis. Busybox di router Anda):
Di * bsd:
Pada sistem seperti * bsd dan solaris,
/dev/stdin
,/dev/fd/0
dan/proc/PID/fd/0
tidak "ajaib" symlink seperti pada linux, tetapi perangkat karakter yang akan beralih ke file nyata ketika dibuka . Stat (2) di path mereka akan mengembalikan sesuatu yang berbeda dari fstat (2) pada deskriptor file yang dibuka.Ini berarti bahwa contoh linux tidak akan berfungsi di sana, bahkan dengan GNU coreutils diinstal. Jika versi stat GNU (1) cukup baru, Anda dapat menggunakan
-
argumen untuk membiarkannya melakukan fstat (2) pada deskriptor file 0, seperti stat (1) dari * bsd:Ini juga sangat mudah untuk melakukan pemeriksaan portable dalam bahasa apa pun yang menawarkan antarmuka ke fstat (2), misalnya. di
perl
:sumber
/dev/null
adalah1:3
, Anda dapat segera mengujinya.stat
perintah saya sudah cukup puas. Saya tidak mengerti gunanya memulai perang penyuntingan antara`
dan$(
pendukung. Secara pribadi, saya lebih suka$(...)
dan ada beberapa alasan POSIX yang mendukung sintaks itu ( pubs.opengroup.org/onlinepubs/9699919799/xrat/... ) Tapi saya tidak melihat gunanya menurunkan jawaban yang seharusnya benar untuk sesuatu yang tidak terkait dengan pertanyaan.$( ... )
lebih disukai daripada backticks dalam konteks jawaban ini?$(..)
gaya sarang lebih mudah dan AIUI adalah pendekatan disukai POSIX. Saya tentu tidak bermaksud memulai segala bentuk perang penyuntingan, lebih memilih untuk berkomentar dengan saran daripada mengubah jawaban Anda yang luar biasa.Di Linux, untuk menentukan apakah input standar dialihkan
/dev/null
, Anda dapat memeriksa apakah/proc/self/fd/0
memiliki perangkat dan inode yang sama dengan/dev/null
:Anda bisa menggunakan
/dev/stdin
bukan/proc/self/fd/0
.Jika Anda ingin memeriksa apakah input standar dialihkan dari perangkat nol, Anda perlu membandingkan nomor perangkat utama dan kecil, misalnya menggunakan
stat
(lihat juga jawaban mosvy ):atau, jika Anda tidak peduli tentang hal ini khusus Linux ,
sumber
bash -c 'ls -l /proc/self/fd/0 /dev/null; [[ /proc/self/fd/0 -ef /dev/null ]] && echo dev null'
lalu lakukan itu lagi dengan</dev/null
. +1/dev/stdin
menjadi symlink ke file asli khusus untuk Linux, sehingga semua orang solusi yang spesifik Linux pula. Yangstat
berbasis membutuhkan GNU atau busyboxstat
. Dengan versi GNU terbarustat
, Anda dapat menggunakanstat -
untuk melakukanfstat()
pada fd 0 yang kemudian akan bekerja pada sistem non-Linux./dev/null
dan perangkat nol.Portably, untuk memeriksa bahwa stdin adalah
null
perangkat (terbuka/dev/null
atau tidak (seperti salinan/dev/null
)), denganzsh
(yangstat
bawaannya mendahului baik GNU dan FreeBSDstat
dengan cara (bukan IRIX 'meskipun))):(perhatikan bahwa tidak disebutkan apakah deskriptor file terbuka dalam mode baca-saja, tulis-saja atau baca + tulis).
Untuk memeriksa apakah itu terbuka pada
/dev/null
file saat ini secara khusus (bukan/some/chroot/dev/null
misalnya), hanya di Linux (di mana/dev/stdin
diimplementasikan sebagai symlink ke file yang terbuka di fd 0 alih-alih perangkat khusus yang ketika terbuka bertindak sepertidup(0)
di sistem lain):Di non-Linux, Anda dapat mencoba:
sumber