$(<file)(ayrıca çalışır `<file`) zshve tarafından kopyalanan Korn kabuğunun özel bir operatörüdür bash. Komut yerine koymaya çok benziyor ama gerçekten değil.
POSIX mermilerinde basit bir komut:
< file var1=value1 > file2 cmd 2> file3 args 3> file4
Tüm parçalar isteğe bağlıdır, yalnızca yeniden yönlendirmelere, yalnızca komutlara, yalnızca atamalara veya kombinasyonlara sahip olabilirsiniz.
Yönlendirmeler varsa ancak komut yoksa, yönlendirmeler gerçekleştirilir (böylece a > fileaçılır ve kesilir file), ancak hiçbir şey olmaz. Yani
< file
Açar fileokumak için, ama hiç komutu var olduğu bir şey olmayabilir. Böylece filekapatılır ve hepsi bu kadar. Eğer $(< file)bir basitti komut ikamesi daha sonra hiçbir şey artıracağı,.
Olarak POSIX tarifnamede , içinde $(script), eğer scriptbu, sadece yönlendirmeler oluşur belirtilmemiş sonuçlar üretir . Bu Korn kabuğunun özel davranışına izin verir.
Ksh'ta (burada test edilir ksh93u+), komut dosyası yalnızca yeniden yönlendirmelerden (komut yok, atama yok) oluşan bir ve yalnızca tek bir basit komuttan (yorumlara izin verilirse) ve ilk yeniden yönlendirme bir stdin (fd) içeriyorsa 0) girişi sadece ( <, <<ya da <<<) yönlendirme, yani:
$(< file)
$(0< file)
$(<&3)( $(0>&3)aslında aynı operatör olduğu için)
$(< file > foo 2> $(whatever))
Ama değil:
$(> foo < file)
- ne de
$(0<> file)
- ne de
$(< file; sleep 1)
- ne de
$(< file; < file2)
sonra
- ilk yönlendirme hariç tümü yok sayılır (ayrıştırılır)
- ve / heredoc / herestring dosyasının içeriğine (ya da eğer böyle şeyler kullanılıyorsa dosya tanımlayıcıdan okunabilecek her ne olursa olsun) ek satır sonundaki
<&3yeni karakterlere eklenir .
sanki $(cat < file)bunun dışında
- okuma dahili olarak kabuk tarafından yapılır,
cat
- boru veya ekstra işlem söz konusu değildir
- Yukarıdakilerin bir sonucu olarak, içerideki kod bir alt kabukta çalıştırılmadığından, herhangi bir değişiklik bundan sonra kalır (
$(<${file=foo.txt})veya içinde olduğu gibi $(<file$((++n))))
- okuma hataları (dosyaları açarken veya dosya tanımlayıcılarını kopyalarken değil) sessizce yok sayılır.
Gelen zsh, sadece bir dosya giriş yönlendirme varken bu özel davranışı yalnızca tetiklenir dışında aynıdır ( <fileveya 0< filehayır <&3, <<<here, < a < b...)
Bununla birlikte, diğer mermileri taklit ederken hariç:
< file
<&3
<<< here...
yani komut olmadan yalnızca komutlar olmadan girdi yeniden yönlendirmeleri olduğunda, komut yerine dışında zsh, $READNULLCMD(varsayılan olarak bir çağrı cihazı) çalıştırır ve hem giriş hem de çıkış yeniden yönlendirmeleri olduğunda, $NULLCMD( catvarsayılan olarak), bu nedenle $(<&3)özel olarak tanınmasa bile operatör, bunu kshyapmak için bir çağrı cihazı çağırarak hala çalışacaktır ( catstdout bir boru olacağı için bu çağrı cihazı gibi davranır ).
Ancak ederken ksh'ın $(< a < b)içeriğine kadar genişleyip aiçinde, zshbu içeriğiyle genişler ave b(veya sadece beğer multiosseçenek devre dışı), $(< a > b)kopyalamak olurdu aetmek bve hiçbir şey vb genişletmek
bash benzer bir operatöre sahip, ancak birkaç farklılık var:
yorumlara daha önce izin verilir, ancak sonra izin verilmez:
echo "$(
# getting the content of file
< file)"
çalışır ama:
echo "$(< file
# getting the content of file
)"
hiçbir şeye genişlemez.
gibi zshbir hayır sonbahar arka tarafta olsa sadece bir dosya Stdin yönlendirme, $READNULLCMDböylece $(<&3), $(< a < b)yönlendirmeleri yapmak ama hiçbir şey genişletmek yoktur.
- bazı nedenlerden dolayı,
bashçağrılmasa da cat, yine de dosyanın içeriğini bir borudan besleyen ve diğer kabuklardan daha az optimizasyon sağlayan bir işlem ister. Bu a gibi yürürlükte bulunuyor bir yerleşik olacağını .$(cat < file)catcat
- yukarıdakilerin bir sonucu olarak, içinde yapılan herhangi bir değişiklik daha sonra kaybolur (
$(<${file=foo.txt})örneğin yukarıda bahsedilen söz konusu $fileatama daha sonra kaybolur).
İçinde bash, IFS= read -rd '' var < file (içinde de çalışır zsh) bir metin dosyasının içeriğini bir değişkene okumak için daha etkili bir yoldur . Ayrıca, sondaki yeni satır karakterlerini koruma avantajına da sahiptir. Ayrıca $mapfile[file], ikili dosyalarla da çalışan zsh( zsh/mapfilemodüldeki ve yalnızca normal dosyalar için) bölümüne bakın .
Pdksh tabanlı varyantların kshksh93 ile karşılaştırıldığında birkaç varyasyonu olduğunu unutmayın. İlgilenilen, mksh(bu pdksh'den türetilmiş kabuklardan biri),
var=$(<<'EOF'
That's multi-line
test with *all* sorts of "special"
characters
EOF
)
burada belgenin içeriğinin (sondaki karakterler olmadan) geçici bir dosya veya boru kullanılmadan genişletilmesi, aksi takdirde burada belgelerde olduğu gibi genişletilmesi, böylece onu etkili bir çok satırlı tırnak sözdizimi haline getirir.
Tüm sürümlerine taşınabilir olmak ksh, zshve bash, en iyi sadece sınıra olan $(<file)değişkenlere modifikasyonlar may içinde veya korunmayabilir yapılan akılda görüş ve rulmanı kaçınarak.
bashbunu şu şekilde yorumlayacak " dediğiniz son paragraftacat filename, bu davranışın komut ikamesine özgü olduğunu mu kastediyorsunuz? Çünkü eğer< filenamekendi başıma koşarsam, bash onu kandırmaz. Hiçbir şey çıktılamaz ve beni bir isteme geri döndürür.