Beklenmeyen belirteç `` 'yakınlarında sözdizimi hatası


15

CentOS için SSH terminalinde aşağıdaki kodu kullandığımda iyi çalışıyor:

paste <(printf "%s\n" "TOP")

Ama aynı satır kodunu bir kabuk betiğine (test.sh) yerleştirir ve terminalden kabuk betiğini çalıştırırsam, şu şekilde hata atar

./test.sh: line 30: syntax error near unexpected token ('   
./test.sh: line 30:     paste <(printf "%s\n" "TOP")

Bu sorunu nasıl düzeltebilirim?


Tam olarak nasıl çalıştırıyorsunuz? ne '#!' line (varsa) betiğinizi başlatır mı? Görünüşe göre bu sözdizimini desteklemeyen bir kabuk yorumlayıcı çağırıyorsunuz (ör. dashYerine bash).
steeldriver

Ben #!/bin/shüstündeki. Olarak idam bash test.shama o da işe yaramadı.
NecNecco

bashPOSIX modunda da bu sözdizimini desteklemez (ile --posixveya olarak çağrıldığında /bin/sh). Kullanın #!/bin/bash.
jordanm

@NecNecco: Başlarken POSIXLY_CORRECTdeğişken ayarınız var bashmı?
cuonglm

@jordanm #!/bin/bashüst tarafa geçmek sorunu çözdü.
NecNecco

Yanıtlar:


23

Proses ikame böylece tüm POSIX kabuk bunu desteklemez, POSIX tarafından belirtilmemişse, sadece bazı kabukları gibi bash, zsh, ksh88,ksh93 destek.

In Centossistemine /bin/shkarşı sembolik bağdır /bin/bash. Ne zaman bashadıyla çağrılır sh, bashPOSIX modu (girer Bash Başlatma Dosyaları - sh ismiyle çağrıldığında ). Posix modunda,process substitution desteklenmez, sözdizimi hatasına neden olur.

bashDoğrudan çağırırsanız komut dosyası çalışmalıdır bash test.sh. Değilse, belki bashposix moduna girmiştir. Bu, bağımsız değişken bashile başlatırsanız --posixveya başlatma POSIXLY_CORRECTsırasında değişken ayarlanırsa oluşabilir bash:

$ bash --posix test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")'

$ POSIXLY_CORRECT=1 bash test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")

Veya bashile inşa edilmiştir--enable-strict-posix-default seçeneği .

Burada, işlem değiştirmeye ihtiyacınız yoktur, standart kabuk borularını kullanabilirsiniz:

printf "%s\n" "TOP" | paste -

-pastestdin'den veri okumayı söylemenin standart yoludur . Bazılarıylapaste uygulamalarda, bu standart olmasa da atlayabilirsiniz.

Yararlı olacağı yer, aşağıdaki gibi birden fazla komutun çıktısını yapıştırırken:

paste <(cmd1) <(cmd2)

Destekleyen sistemlerde /dev/fd/n, aşağıdakilerle yapılabilir sh:

{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0

( <(...)dahili olarak ne yapar).


2

İşte başka bir çözüm. Komutu çalıştırmak yerine bash komutunu çalıştırın ve -c komutunu kullanarak bash komutunu iletin:

bash -c 'paste <(printf "%s\n" "TOP")'
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.