CMD.EXE'nin yeterince belgesiz olduğu göz önüne alındığında, beklenen davranışın ne olması gerektiğinden emin değilim. Beklenen davranışın ne olduğuna dair hiçbir belge görmedim. Bu yüzden davranışlardan herhangi birinin hata olup olmadığına dair kesin bir cevap verebilecek birini bulmakta zorlanacağınızı düşünüyorum. Ama kesinlikle bunun tutarsız olduğuna katılıyorum ve en azından bana göre bir tasarım hatası gibi görünüyor.
Belirli bir komutun davranışının tekrarlanabilir göründüğü için durumu kaotik olarak nitelendirmezdim. Ancak CMD.EXE tutarsız, herhangi bir komutun sınamadan nasıl davranacağını tahmin etmenin bir yolunu göremiyorum.
Hiçbir açıklamam yok, ancak davranışların rafine sınıflandırılmaları var.
Stdout veya stderr komutunun stdin komutuna yeniden yönlendirilmesi, hiçbir komut aslında yeniden yönlendirilen çıktıya hiçbir şey yazmaya çalışmadığı sürece mükemmel çalışır. Garip davranış, yalnızca bir iç komut stdin'e yönlendirildikten sonra stdout'a veya stderr'ye yazmaya çalıştığında ortaya çıkar.
Testlerinizi genişlettim ve aşağıdaki belirgin davranışları gördüm:
Yönlendirilmiş STDERR 2>&01
Kapsamlı testler yapmadım, ancak stderr'e yazılan her iç komut stderr stdin'e yeniden yönlendirilmişse derhal komut oturumunu sonlandıracak. Örnekler şunları içerir:
cd invalidPath 2>&0
vol x 2>&0
copy nonExistentFile 2>&0
move nonExistentFile 2>&0
set nonExistentVariable 2>&0
dir nonExistentFile 2>&0
Bir istisna olduğunu düşündüğünüz şey aslında asla stderr'e yazmadı. Yeniden yönlendirme yapmadan aşağıdakileri deneyin; hata mesajı olmadığını göreceksiniz:
dir nonExistentFIle *
Bu nedenle, stderr stdin'e yönlendirilirse, komutun komut oturumunu sonlandırması için hiçbir neden yoktur.
DIR, yalnızca sağlanan tüm dosya maskelerinde eşleşen bir dosya bulamazsa bir hata mesajı basar.
:: This prints an error message
dir nonExistentFile1 nonExistentFile2
:: So this terminates the command session
dir nonExistentFile1 nonExistentFile2 2>&0
Yönlendirilmiş STDOUT 1>&0
Yönlendirilen stdout için gördüğüm davranışlar şunlardır:
1) Çıkış, hata mesajı olmadan etere gider.
Örnekler:
vol >&0
copy /-y file1 existingFile2 >&0
move /-y file1 existingFile2 >&0
2) Çıkış başarısız olur ve stderr'de bir hata mesajı görüntülenir. Tek bir komut, her başarısızlık stdout'a yazma girişimi için bir tane olmak üzere birden fazla hata mesajı oluşturabilir.
Örnekler:
cd >&0
echo Hello >&0
:: This generates 2 error messages, one for the time,
:: and another for the subsequent empty line
time /t >&0
3) Çıkış başarısız olur ve toplu işlem sonlandırılır. Aktif SETLOCAL, bir ARAÇ alt rutinde hata oluşursa, toplu iş sona ermesinden sonra bile etkin kalır. Bu bakımdan, ölümcül bir sözdizimi hatası gibi davranır.
Şimdiye kadar sadece bir komutun bu davranışı sergilediğini gördüm:
dir >&0
DIR komutunun, girişilen her giriş satırı için bir hata mesajı oluşturmasını beklerdim. Ancak ilk satırdaki başarısızlıktan sonra sona ermiş gibi görünüyor ve toplu işlem de iptal edildi.
4) Bazı komutlar birden fazla davranış sergiler.
Örnekler:
:: This SET command generates an error message for each
:: defined variable (behavior 2)
set >&0
:: But this SET command fails to display the prompt without
:: error message (behavior 1). Note that the echo of user input
:: is written directly to :con. It does not use stdout or stderr.
set "var=prompt" >&0
:: A single PAUSE exhibits both behaviors 1 and 2. The prompt to
:: press a key simply dissapears, and the echo of the user input
:: generates an error. Note that in this case, the echo of user
:: input is written to stdout.
pause >&0
dir
şey bulunduğunda komutun stderr'ye yazmadığını görmedim . Ve evet, tutarsızlık kesin terimdir, teşekkür ederim.