2011-08-12 7 views
90

Bu sözdizimi aşina olduğum:Heredocu pipetlemek için çok satırlı sözdizimi; Bu taşınabilir mi?

cmd1 << EOF | cmd2 
text 
EOF 

ama sadece bu Bash keşfetti beni yazmasına olanak tanır:

cmd1 << EOF | 
text 
EOF 
cmd2 

(heredoc CMD2 için girdi olarak kullanılır). Bu çok garip bir sözdizimine benziyor. Taşınabilir mi?

+0

Ben bu satırlara bölme iyi bir yol bulmak için geldim: EOF args sürü << ile 'büyük uzun Command1'ı | büyük-uzun-komut2 ile çok sayıda. "Tuhaf sözdizimi" en iyi yol gibi görünüyor. – PaulC

+0

Bunun için uygun bir kullanım durumu, sekmeyle ayrılmış bir alana ayrılmış bir tabloyu Google E-Tablolar'a yapıştırabilmeniz için dönüştürmeye çalıştığınız zamandır. Geçici bir dosya oluşturmanız gerekmeyecek. –

+0

1'i z-shell'de benim için çalışmadı. İkincisi sevmiyorum çünkü o yabancılaşıyor | Komuttan, kabuk boru hatlarının deyimsizliğini (?) kaybetmek. –

cevap

72

Evet, POSIX standardı buna izin verir.

burada-belge According to the 2008 version: sonraki <newline> sonra başlar ve ara <blank> karakterlerle sadece sınırlayıcı ve <newline> içeren bir satır, kalmayıncaya kadar devam eder tek bir kelime olarak muamele görür. Ardından, burada bir belge varsa, bir sonraki belgeye başlar.

Ve aynı çizgide "Burada-belgelerin" çoklu bu örneği içerir:

cat <<eof1; cat <<eof2 
Hi, 
eof1 
Helene. 
eof2 

Yani yönlendirmeleri veya boruların yapıyor sorun yoktur. bu tanımlar

cat file | 
cmd 

Ve (daha aşağı bağlantılı sayfasında) kabuk gramer içerir:

pipe_sequence :        command 
       | pipe_sequence '|' linebreak command 

newline_list  :    NEWLINE 
       | newline_list NEWLINE 
       ; 
linebreak  : newline_list 
       | /* empty */ 

Yani bir boru sembolü bir sonu değerlendirmeleri ile takip edilebilir Sizin örnek böyle bir şey benzer hat ve hala bir boru hattının parçası olarak kabul edilebilir.

9

Hmm, POSIX modunda bash testine göre, evet varsayalım:

$ bash --posix 
$ cat <<EOF | 
> ahoj 
> nazdar 
> EOF 
> sed 's/a/b/' 
bhoj 
nbzdar 
+1

"dash" da çalışıyor –

+0

Sadece bir tane daha küçük not: 'EOF' kapandıktan sonra boşluk bırakmayın. İstisna garip bir şekilde davranacak ve neyin yanlış olduğunu merak edeceksiniz. –

+0

POSIX modunda çalışan bash, * bazı * uzantıları kapatabilir, ancak bunların hemen hemen hepsinde bile hiçbir şekilde bulunmaz. Dolayısıyla, bu cevap POSIX'in neye izin verdiği konusunda doğru olsa da, akıl yürütme bunu çok etkili bir şekilde desteklememektedir. Yukarıdaki çalışmıyor –

15

Evet, POSIX kabuk dilbilgisinde var. Ayrıca burada-doc biri aynı komutu için olandan fazlasına sahip olabilir (diğer bazı örnekler iki cat çağırmaları kullanır, ancak bu kadar iyi çalışır): Bu stdin için 2 burada-docs kullanılarak (yapmacık olduğu

cat <<EOF1 <<EOF2 
first here-doc 
EOF1 
second here-doc 
EOF2 

), ancak farklı dosya tanımlayıcıları için girdi sağlamayı düşünüyorsanız, hemen anlam ifade eder.

da cat'u tamamen'a bırakma olasılığı vardır. Neden cmd doğrudan mevcut burada-belge yapamaz:

cmd << EOF 
input 
here 
EOF 
+0

'' ' kedi << EOF1 << EOF2 burada ilk-doc EOF1 ikinci buraya-doc EOF2 ' '' . – user1424739

+0

@ user1424739 Geçerli zsh ve bash'ta çalışıyor. Kül ve ksh93 sadece burada ikinci doktora çıktı gibi görünüyor. – Jens

+0

Neden düşüş var? Yanlış bir şey varsa, lütfen bana çare fırsatı verin. – Jens