Karakterleri bir dosyadan gelmiş gibi bir komuta nasıl gönderebilirim?
Mesela denedim:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Karakterleri bir dosyadan gelmiş gibi bir komuta nasıl gönderebilirim?
Mesela denedim:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Yanıtlar:
Kabuklarda destekleyen burada dizeleri dahil bash
, zsh
ve ksh93
kullanabileceğiniz
wc <<< "apple pear orange"
Diğer iki yaklaşım (ekstra çaba göstermeden çoklu hat girişine izin veren):
Bir "burada belge" kullanın:
$ wc << EOF elmalı armut EOF 1 3 18 $
EOF
Dize bir ayırıcı. Herhangi bir dize kullanabilirsiniz; EOF
sadece geleneksel bir seçimdir.
Tty'yi girdi olarak kullanın:
$ wc elmalı armut Ctrl+D 1 3 18 $
Bu programın çalışmaya başlamasının dezavantajına sahiptir ve adını girdiğiniz anda girişi okumaya başlar. Bu endişe verici olabilir; Örneğin:
$ grep v Çabuk kahverengi tilki (daktiloda) atlar (daktiloda) atlar (bu grep'ten çıktı!) Tembel köpeği. (yazılan) Ctrl + D (Burada çıktı yok) $
<<<
Form aynı zamanda fazladan çaba gerektirmeden çoklu hat girişine izin verir, çünkü "
açık dizge yeni satırlar içerebilir. Elbette << EOF
, çok satırlı girişiniz varsa , formu (orijinal burada-doc sözdizimi) okumak kolaydır.
<<<
word
elbette, kabuk bağlamında, word
boşluklar ve yeni satırlar içeren bir alıntı dize olabileceğini söylüyor. D'oh! Bu söylenmeden gittiği çok açık (ve aslında, man sayfasında hiç görmüyorum). :-( Bana gösterdiğin için teşekkür ederim!
word
, sayfadaki "Kabuk tarafından tek bir birim olarak kabul edilen bir karakter dizisi" (aka "token") olarak tanımlanır ve alıntılanan dizelerin ilgili anlamda (tek bir birim olarak) ele alındığını bilmeniz gerekir (sonra Ters eğik çizgi vb değişken genişleme işleme" ama aslında bütün kabuk işleme modeli çok iyi düşünülmüş bir çift alıntı kabukta amacı (tek tırnak işareti de genişleme korumak.) ve bir şey ama basit olduğunu..
Burada birkaç geçerli çözüm olmasına rağmen, bazen yararlı olabilecek başka bir sözdizimi de komut çalıştırmaktır <()
. Bu, komut satırında 1'den fazla dosya tanıtıcı nesnesi oluşturmanıza izin verir.
Uzun metin dizelerini karşılaştırmak gibi bir şey yaparken ya da dosyada olmayan bir içeriği dağıtmak istediğinizde bu yararlı olabilir.
Örneğin, ana bilgisayar dosyasını localhost'a kopyalamak zorunda kalmadan ana bilgisayar dosyalarını iki düğümde karşılaştırarak:
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
<
STDIN bir dosya yönlendirmeleri ve ()
parantez arasındaki komutunu çalıştırmak için bir altkabuk oluşturun. Çalıştırılan komutun STDIN'ine iletilen alt kabuktan STDOUT'dur.
Komutta birden fazla giriş "dosyası" oluşturmak, burada birden çok dokümanı kullanmaya çalışmak veya son komutun bir boru hattına birden çok komut eko yapmaktan daha kolay bir yoldur.
<fileorpathname
stdin yönlendirir, ancak <(subcmd)
yapmaz; Program tarafından / eğer açıldığında stdout'u subcmd'den okuyabilecek bir isim kullanılır. < <(subcmd)
(boşluk gerekli) stdin'i bu dosyadan yönlendirir, neredeyse subcmd |
. Sizin diff
okuyabilir birini bir argüman belirterek Stdin'den girişlerinden -
ikisini birden değil.
cmd <(cmd2 ...)
ve cmd < <(cmd2 ...)
. Birincisi türetilmiş verilerin (cmd2'nin çıktısı) bir dosya adı yerine kullanılmasına izin verir. Sonuncusu eşdeğerdir cmd2 ... | cmd
. Komutlar açıkça stdin girdisini kabul etmek için yazılmalıdır ve çoğu değildir. Bu özellikle kabuk skriptleri için geçerlidir.
Beklediğiniz gibi bir şey kullanmak isteyebilirsiniz. Aşağıdakiler uzaktan bir telnet oturumu açmak, istemini beklemek, veri göndermek, yanıt beklemek, uyku ve çıkış için basit bir örnektir.
#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1