“Cat> file_name << blah” komutunu nasıl anlayabilirim?


13

Aşağıdaki komutta cat here-doc içeriğini alır ve conf adlı dosyaya yönlendirir:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Buradaki komutların sırasını nasıl anlayabilirim? bashİlk önce diğer her şeyi (burada-doc kısmı) işler mi ve son adım olarak o > confkısmı mı görüyor?

Yanıtlar:


17

Here-Document bir tür kabuk yeniden yönlendirmesidir, bu nedenle kabuk, baştan sona (veya soldan sağa veya görünüm sırasına) normal yönlendirme olarak gerçekleştirir. Bu POSIX tarafından tanımlanmıştır:

Bir komutla birden fazla yönlendirme operatörü belirtilirse, değerlendirme sırası baştan sona doğrudur.


Emriniz olarak, catyapacak > confilk açık ve truncate confverileri daha sonra, yazma okuma için dosya Here-Document.

Kullanarak strace, şunları doğrulayabilirsiniz:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

Anlıyorum. Böylece temelde durumunda ne cat > file_name << blaholduğunu çalıştırmadan önce olduğu stdout'u adlı dosyaya bağlı olan kabuğun sonra ve stdin'i kabuğun bağlanır burada-doc ? catfile_name
Martin

@Martin: Evet. Daha openönce çağrıldığını görebilirsiniz dup2.
cuonglm

12

Şimdi bulalım:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Sanırım >"$file"ilk önce o kısmı yapıyor olmalı . Ama ya ...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...hata yok...?

cat ./myfile

this is in ./myfile

Göründüğü gibi, sipariş önemlidir.


-1

Ne zaman bashvadede süreci yaratır cat, o açılır confdosya tanımlayıcı 1 yazmak için ve daha önce dosya tanımlayıcı 0 üzerinde okuma (burada-belge için) geçici bir dosya açar execprogramı ing. Bu durumda, bu eylemlerin hangi sırada gerçekleştiği önemli değildir.

Dosya tanımlayıcıları yeniden atandığında sıra önemli hale gelir, örn 2>&1.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.