$(<file)
(ayrıca çalışır `<file`
) zsh
ve 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 > file
açılır ve kesilir file
), ancak hiçbir şey olmaz. Yani
< file
Açar file
okumak için, ama hiç komutu var olduğu bir şey olmayabilir. Böylece file
kapatı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 script
bu, 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
<&3
yeni 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 ( <file
veya 0< file
hayı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
( cat
varsayılan olarak), bu nedenle $(<&3)
özel olarak tanınmasa bile operatör, bunu ksh
yapmak için bir çağrı cihazı çağırarak hala çalışacaktır ( cat
stdout bir boru olacağı için bu çağrı cihazı gibi davranır ).
Ancak ederken ksh
'ın $(< a < b)
içeriğine kadar genişleyip a
içinde, zsh
bu içeriğiyle genişler a
ve b
(veya sadece b
eğer multios
seçenek devre dışı), $(< a > b)
kopyalamak olurdu a
etmek b
ve 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 zsh
bir hayır sonbahar arka tarafta olsa sadece bir dosya Stdin yönlendirme, $READNULLCMD
bö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)
cat
cat
- 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 $file
atama 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/mapfile
modüldeki ve yalnızca normal dosyalar için) bölümüne bakın .
Pdksh tabanlı varyantların ksh
ksh93 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
, zsh
ve 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.
bash
bunu şu şekilde yorumlayacak " dediğiniz son paragraftacat filename
, bu davranışın komut ikamesine özgü olduğunu mu kastediyorsunuz? Çünkü eğer< filename
kendi başıma koşarsam, bash onu kandırmaz. Hiçbir şey çıktılamaz ve beni bir isteme geri döndürür.