Bash for sh Ubuntu'da nasıl kullanılır


14

Kaynaklarını bir rpmdosya olarak içeren büyük bir program yüklüyorum . Hattına yapışmış

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

Görünüşe göre, bu sözdizimi ile Red Hat Linux'ta shçalışın bash, ancak unexpected operatorUbuntu'da hata veriyor .

Komut bashdosyası rpmpaketten geliyor gibi komut dosyasını değiştiremiyorum . rpmPaketi çıkarabilir ve yeniden paketleyebilirim , ancak bu tür komut dosyalarının çoğu olabilir.

Kabuğu varsayılan #!/bin/sholarak işleci bashişleyebilecek başka bir şey olarak değerlendirmek için değiştirmenin bir yolu var mı [?


5
Yanlış olan tek şey ==olması gereken şey =. Bu ve değişken açılımların çift tırnak içinde olması gerekir.
Kusalananda

4
[bir operatör değil, çağrılan yerleşik bir komuttur test. Beklenmeyen işleç ==ve =POSIX uyumlu olmadığından bu ile değiştirilmelidir .
schily

Yanlış olan ikinci tek şey, $SCITEGICPERLHOMEalıntılanması gerektiğidir.
l0b0

12
Programın yazarına şikayet etmelisiniz. Kullanıyorlarsa #!/bin/sh, bashuzantıları değil yalnızca POSIX kabuk özelliklerini kullandıklarından emin olmalıdırlar . Bu programcı çok özensiz. Kodunu düzeltmeli ya da kullanmalıdır #!/bin/bash.
Barmar

Diğer benzer konuları merak eden insanlar için " Bashizmler " listesi . Ayrıca bu soruya bakın .
Kaptan Adam

Yanıtlar:


21

Dilini uygulayan birden fazla program var /bin/sh. Ubuntu'da, /bin/shhızlı olması, az miktarda bellek kullanması için tasarlanan ve beklenenden en azını desteklemeyen çizgi /bin/sh. RHEL'de, /bin/shdaha yavaş olan ve daha fazla bellek kullanan ancak daha fazla özelliğe sahip olan bash'dir. Bu özelliklerden biri koşullu sözdizimi ==operatörüdür [. Dash [, temel bir sh özelliği olan destekler , ancak ==bash (ve ksh ve zsh) uzantısı olan operatöre sahip değil .

Sisteminizi bash kullanarak değiştirebilirsiniz. Ubuntu'da, /bin/shsimgesel bir bağlantıdır dash. Bunun bashyerine sembolik bir bağlantı yapabilirsiniz . Debian ve Ubuntu'nun (ve türevlerinin) mevcut sürümleri bunu bir tire yükleme seçeneği haline getiriyor. Değiştirmek için çalıştırın

sudo dpkg-reconfigure dash

ve kısa çizgi olarak tutmak için "evet" /bin/shveya bash'a geçmek için "hayır" yanıtını verin .

Bash'i olduğu gibi tutabilirsiniz /bin/sh, ancak sisteminizi biraz daha yavaş hale getirir. Bazı sistem komut dosyalarının bash ile uyumsuz olduğu bile düşünülebilir, ancak bash çoğunlukla tire süper bir set olduğundan, bu olası değildir.


Uygulamaları arasında seçim yapmak için bir arayüzü olmayan dağıtımlar /bin/shiçin bash'a nasıl geçileceği aşağıda açıklanmıştır.

sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh

Terminali açık tutun ve shbundan sonra bazı komut dosyaları çalıştırabildiğinizi kontrol edin . Bu komutu karıştırırsanız, sisteminizi kullanılamaz hale getirir. (Bu arada, neden birden çok komut yukarıdaki ziyade basit görünümlü kullanılan sudo ln -sf bash /bin/sholmasıdır ln -sfbilgisayarınız bu işlem sırasında çöktü kuşkusuz olası durumda, kurtarma ortamından boot gerekiyordu atom değildir. Yeniden açar. Aksine mvatomiktir.)

Kısa çizgiyi şu şekilde geri yüklemek için /bin/sh:

sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh

/bin/bashDağıtımınızda sh varsayılan olarak varsa , kısa çizgiye geçmenin komut dosyalarının başarısız olmasına neden olabileceğini unutmayın, çünkü bash kısa çizgiden çok daha fazla özelliğe sahiptir. Bash komut dosyaları ile başlamalı #!/bin/bashve ile başlayan komut dosyalarında #!/bin/shbash'a özgü özellikler kullanılmamalı, ancak bash ile birlikte gelen dağıtımlarda, o dağıtıma özgü komut dosyalarında /bin/shbash'a özgü özellikler kullanılabiliyor #!/bin/sh(kullanıcıların herhangi bir beklenti olmadığı sürece sorun değil) olarak kısa çizgiye geçebilir /bin/shve bu komut dosyalarının başka bir dağıtımda çalışacağı beklentisi yoktur).


Benim düşünceme göre, /bin/shBash olduğunda bazı komut dosyaları başarısız olursa , bu sistemde (komut dosyası ile paket) ya da shBash'ın -modunda bir hata . Stephen'ın dediği gibi, sistem açıkça /bin/shBash'e geri dönmeye izin veriyor dpkg-reconfigure. Bu konuda Ubuntu wiki'de
ilkkachu

5
@ilkkachu Evet, eğer bir komut dosyası /bin/shbash ise başarısız olursa , bu bir hatadır. Ancak, hatalar olur. Başkaları sizin için test ettiği için bu tür hataları teşhis edip istemiyorsanız varsayılana sadık kalmanızı öneririz. Dash'i /bin/shresmi olarak Debian'da desteklendiği gibi kullandım , ancak bir şey olursa başa çıkabileceğimi bilerek bu aldığım bir riskti.
Gilles 'SO- kötü olmayı bırak'

Manuel olarak geçersiz kılınan sembol bağlantılarının bir debconfsonraki dashgüncellemede hangi yapılandırmanın depolandığına geri yükleneceğini unutmayın ; Kuşkusuz bu Debian kararlı çalıştıran sistemler için (eğer belli bir sürümde) sık olmayacaktır.
Stephen Kitt

36

Geçiş shyapmak için bash( dashvarsayılan yerine ) yeniden yapılandırın dash(evet, biraz sezgisel):

sudo dpkg-reconfigure dash

Bu dash, varsayılan sistem kabuğu olmak isteyip istemediğinizi soracaktır ; “Hayır” cevabını verin ( Tabsonra Enter) ve bashbunun yerine varsayılan değer olacaktır ( yani /bin/sh işaret edecek /bin/bash).


1
Çözümünüz gerçekten en makul olanıdır, ancak sorunu açıklayan ayrıntılı açıklamalar nedeniyle başka bir cevabı kabul ettim. Rahatsızlık için özür dileriz.
Googlebot

@Googlebot özür dilemeye gerek yok, kabul edilen cevabı seçmek sorucunun ayrıcalığıdır. Ve ondan altın bir rozet aldım ;-).
Stephen Kitt
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.