Sözdizimsel olarak geçerli olmayan bir bash kodu olmayan bir sh kodu var mı?


31

shSözdizimsel olarak geçerli olmayan bir bash kodu olmayan herhangi bir kod var mı ?

Ben üzerine yazarak düşünüyorum shile bashbelirli komutlar için.


1
Sanırım geçerli demek, sözdizimsel olarak geçerli demek istedim, bu yüzden sözdiziminde sıkıntı yaratmayacak
Alexander Mills

2
Farklı belirteçleme? örneğin ((akla geliyor.
18'de

1
Bazı dağıtımlar /usr/bin/shiçin sadece bir işaret bağlantısıdır /usr/bin/bash(CentOS 7.3 kullanıyorum ve öyle). Dağıtımın için shgerçekten olup olmadığını kontrol etmelisin bash.
Centimane

1
Birkaç yıl önce, projem bir şey bash'te "yükseltildiğinde" kırıldı. Bütün Shebang hatlarım arasında değişmek zorunda #!/bin/shkaldı #!/bin/bash. Sonra her şey tekrar çalıştı, bu yüzden gerçekten dikkatli olmalısınız. Sh için bash yerine tire kullanmaya başladıklarında olmuş olabilir.
Joe

1
@Joe, OP'nin istediği şeyin tam tersi - sh kodu olarak yanlış etiketlenmiş bash kodunuz vardı. OP, bash ile çalışırken kırılan (gerçek, yanlış etiketlenmemiş) sh kodunu yazıp yazamayacağını soruyor, sh ile çalışırken kırılan bash koduna sahip olup olmadığını soruyor ( bash uzantıları yoksa mevcut dil özellikleri üzerinde herhangi bir etkiye sahip olsalar, uzantı olmazlar)
Charles Duffy

Yanıtlar:


49

POSIX sh ve Bash'te farklı şeyler yapan bir kod :

hello &> world

Bunun sizin için "geçersiz" olup olmadığını bilmiyorum.

Bash, bu standart çıktı ve standart hata hem yönlendirmeleri gelen hellodosya içine world. POSIX'te sh, helloarka planda çalışır ve ardından worldkeserek boş bir yeniden yönlendirme yapar (kısaltılmış olarak kullanılır & >).

Bash uzantılarının altında çalıştıklarında işlerini yapacağı bashve saf POSIX'te farklı etkileri olacağı birçok başka durum vardır sh. Örneğin, ayraç genişletme başka bir şeydir ve Bash'in POSIX modunda da aynı şekilde çalışır, aynı değildir.


Statik sözdizimi hataları giderilirken, Bash, POSIX tarafından belirtilmeyen, hem geçerli bir POSIX kabuk kodu, ancak bir Bash sözdizimi hatası, hem de sözdizimi hatalarıyla sonuçlanabilecek çeşitli POSIX uyumsuzluk hataları geçmişi gibi ayrılmış kelimeleri (gibi [[ve time) [[ xiçerir. bu sorudan olan gibi :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

Yalnızca sözdizimi-hataları, önemli olduğu durumlar için "geçersiz" ifadesinin oldukça tehlikeli bir tanımıdır, ancak olduğu yerde.


3
Ayraç genişlemesi şu anda bash (ve zsh, pdksh, ksh93) ile uyumlu değildir, ancak POSIX, ayraç genişlemesine izin vermek için (ve {fd}>filebenzer bir sorunu) belirtimde provizyon eklemek için çalışmaktadır , böylece bash tekrar uyumlu olabilir (ayraç genişlemesi). belirtilmemiş kalır, ancak uyumlu komut dosyalarının çıktısını almak echo "{a,b}"istemeleri {a,b}gerekir. Başlayan tartışmaya
Stéphane Chazelas 11:18

2
Bu Soru ve Cevap ile ilgili ayrıca: austingroupbugs.net/view.php?id=1191#c3983
Stéphane Chazelas

2
POSIX sh içine bir komut dosyası yazan biri hiç böyle bir komut yazar mı? OP sh’tan bash’a gidiyor ve benim anladığım kadarıyla bu, diğer yöne gitmek daha çok bir sorun olacak gibi görünüyor?
Rich

1
@Rich: Tabii. /bin/shBash olan herhangi bir sistem kullanmıyorum , bu yüzden aktif olarak bu bashizmden haberdar olmasaydım, bir komut satırı yazmak kolaylıkla olabilirdi. Cevaptaki boşluklar olası görünmüyor ancak hello&>worlddaha az alınabiliyor.
R. ..

2
Aslında geçen ayki farktan dolayı&> bir hata gördüm !
Gordon Davisson

16

Kısa bir örnek:

time()(:)

timeBash ayrılmış bir kelimedir ve timeprogramdan farklı davranır . timeBash kullanarak sonucunu ayrıştırmaya çalışan bazı pratik komut dosyalarını kırabileceksiniz . Ancak teknik olarak bir sözdizimi hatası değildir. timeBir fonksiyon olarak yeniden tanımlanması nadirdir, ancak bu sorunun belirttiği gibi bir sözdizimi hatasına neden olur.

Daha kısa bir örnek:

a():

dashPOSIX uyumlu, ancak geçerli değil.


3
Daha genel olarak, standart olmayan bir anahtar kelime veya Bash'deki yerleşik bir komut olan herhangi bir kelime aynı etkiye neden olur. Ek olarak time, malzeme gibi var declare, function, selectve coproc. Bunların bazıları açıkça standartta belirtilmemiş olarak işaretlenmiş olsa ( anahtar kelimeler ve yerleşikler / yardımcı programlar ), ancak örneğin timeveya coproclistede göremiyorum . Ve kullanmak --posixyardımcı görünmüyor.
ilkkachu
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.