/ Bin / dash nedir?


27

/bin/shSeçtiğim kabuğa bir bağlantı olduğunu sanıyordum . Ben her zaman kullandım bash, bu yüzden /bin/shişaret edeceğini düşündüm /bin/bash. Yine de işaret ettiği ortaya çıkıyor /bin/dash.

Daha komik olur. Ben başlıyorum dashve yapıyorum echo $SHELLve yazdırıyor /bin/bash(yani onlar temelde aynı mı?). Ancak, man sayfasının man sayfasından dashtamamen farklı bash(yani aynı değiller ?).


1
@ wzzrd, Bu soru linux'a özgü mü?
aioobe

1
15, tekrar etmem gerektiğinden, bu güzel cevapların hepsini kaldıramadım.
İstif akışında

4
mmm dash .. / bin / crash (gdb hayranları için), / bin / slash (kemer sıkma programı), / bin / mash (Kore'de zor zamanlar), / bin / sash (ponpon kızlar için), / bin / thrash (HDD’nizde zor), / bin / flash (ancak verilerinizi şifrelemeniz durumunda), / bin / stash (daha sonra bulabilmeniz için iyi şanslar), / bin / cash (her zaman paranızsınız), / bin / pash (PC'yi romanlaştırıyor), / bin / gash (aaargggh!).
PP.

2
@PP - G / / bin okuma Metal müzik tutkunları için thrash ve / bin / ... :-P 80'lerin rock grubu kurşun gitaristlerinden hayranları için çizgi ediyorum
gWaldo

1
Sebebi echo $SHELLbaskılar /bin/bashçalıştırmakta olduğunuz geçerli kabuk yerine giriş yaptığınızda o değişken başlar varsayılan kabuk için ayarlandığı için olduğunu. Bash komut isteminden ksh veya zsh başlatın ve echo $SHELLhala söyleyelim /bin/bash. psŞu anda neyin çalıştığını görmek için kullanın .
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


43

Debian ve Ubuntu birkaç şey yüzünden kısa çizgiye (iirc) geçti. Her şeyden önce, Bash yıllar içinde büyük olmuştur. Aslında, /bin/bashUbuntu 8.04 sistemimdeki ikili, neredeyse on kat (!) Kadar büyük /bin/dash. Şimdi, bu günlük kullanım için çok önemli değil, ancak aşağıdaki durumlarda önemlidir:

  • Çizgi çok daha küçüktür ve bu nedenle daha hızlı yüklenir, bu da init betikleri için bir nimettir. Bunların çoğuna başlamanız gerekiyorsa, her seferinde Bash yerine Dash yüklemek, işleri önemli ölçüde hızlandırır.
  • Dash'in daha küçük olması nedeniyle, Debian ve Ubuntu, başka şeylere daha fazla yer bırakarak (ve diğer şeyleri hızlandırarak) kendi büyüklüklerinin büyük bir kısmını tıraş edebiliyorlar.

Komut dosyası yazmak için Bash yerine Dash kullanmanın olumsuz yanı, birçok insanın Bashash denilen, yalnızca Bash'in sahip olduğu sözdizimsel kükürleri kullanmasıdır . Bashism'lerin örnekleri şöyledir:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

Ve bu:

echo ${a#123}
4567890

Dash, diğer yandan esas olarak POSIX uyumlu (ve bundan daha fazlası değil) olmayı hedefliyorsa, şunu denerseniz size Kötü bir alt işleme hatası verir:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Bu, sizin betik betikleriniz için tercüman olarak kullanmanız /bin/sh(ve dolayısıyla dash) ve içlerinde Bashizmalar kullanmanızın önemi olacaktır. Debian ve Ubuntu, Asismiler ve genel olarak shellscriptlerde neden kötü olduklarını ve özellikle de init-scripts ile ilgili güzel wiki sayfalarına sahipler. Bu nedenle, bilinçli olarak ihtiyacınız olup olmadığını /bin/shveya /bin/bashbetiğiniz için tercüman olarak seçmelisiniz .

Dash, sistemlerinizde varsayılan kabuk olarak kullanılmamalıdır. Bunun için sadece Bash'i kullanın. Komut dosyalarınızın taşınabilirliği için, komut dosyalarının diğer Linux lezzetleri ve Unix'lerde yayınlanma olasılığını artırmak için Dash'i tercüman olarak kullanabilirsiniz.


1
Eğer Bashisms ile komut dosyaları yazarsanız, lütfen belirtiniz /bin/bash; Linux olmayan birçok sistem, shuyumlu bile olmadıkları gerçek kabuklara sahiptir bash.
Chris S

echo ${a#123}bir bashism değildir, POSIX Parametre genişletme spesifikasyonunun bir parçasıdır. pubs.opengroup.org/onlinepubs/009695399/utilities/… Siz sadece daha gelişmiş sed tarzını elde edemezsiniz, Bash olanları, Posix olanları alt stil ve basit genişleme karakterleridir. Anlamı, POSIX de sağlarecho ${a#*6}
JM Becker



0

$SHELLÇalıştırıldığında ayarlanan tüm kabuklar olmadığından , şu anki kabuğunu şu şekilde bulursun:

echo $0

Eğer bir hata verirse, bu csh'dir, aksi takdirde , bunun bir giriş kabuğu olduğunu belirtmek argv[0]için tipik olarak kabuk, belki de önde gelen -tire ile çağrılan sizsiniz .

Bu garanti edilmez , çünkü argv[0]çağıran sürecin kontrolü altındadır, ancak pratikte en güvenilir yaklaşımdır.

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.