Bash scriptleri kabuk scriptleri ile aynı mıdır?


58

Ubuntu için çok yeniyim. İnsanların "kabuk komut dosyası", "bash komut dosyası" dediğini duyuyorum.

Acaba aynılar mı? Yoksa onlar farklı mı?


En yararlı bir yanıtı var SO
Sn Pei

Yanıtlar:


55

Bash ( bash) birçok mevcut olanlardan biridir (henüz en yaygın kullanılanıdır) Unix kabukları. Bash, " B ourne A kazanç SH ell" anlamına gelir ve orijinal Bourne kabuğunun ( sh) değiştirilmesi / geliştirilmesidir .

Kabuk komut dosyası herhangi bir kabukta kod yazarken, Bash komut dosyası özellikle Bash için komut dosyasıdır. Bununla birlikte, pratikte, "kabuk betiği" ve "bash betiği", söz konusu kabuk Bash olmadıkça, genellikle birbirinin yerine kullanılır.

EDIT: Aslında, Ubuntu'daki varsayılan komut dosyası kabuğu, çizgi biçimindeyken, varsayılan etkileşimli kabuk (bir uçbirim alırsanız ne alacağınız) Bash'dir. Bununla birlikte, iki terim hala çoğunlukla birbiriyle değiştirilebilir.


1
Kısa çizgi varsayılan komut dosyası kabuğu olarak ne tanımlar?
wjandrea

1
@wjandrea /bin/shSembolik bağlantı /bin/dash, varsayılan sistem kabuğunu oluşturur, ancak varsayılan komut dosyası kabuğu değildir , yani kesinlikle kullanmanız gereken yazılı bir kural yoktur /bin/sh. Biri kullandığında /bin/sh, esas olarak taşınabilirlik nedenlerinden dolayı, komut dosyanızın çoğu /bin/shPOSIX uyumlu Bourne ailesi kabuğu olan Unix benzeri işletim sistemi platformlarında kullanılmasını beklediğiniz zamandır.
Sergiy Kolodyazhnyy

29

Giriş

Kabuk komut dosyası yazma ve Bashkomut dosyası oluşturma aynı şey değildir, çünkü shbir komut dosyasını çalıştırmak için kullanılabilecek diğer kabuklar mevcuttur ; tarafından çalıştırılması amaçlanan bir komut dosyası, komut dosyası Basholarak etiketlenmelidir Bash. Terimler çoğu zaman birbirinin yerine kullanılır Bash, çünkü , genişletilmiş işlevselliği ile birlikte, shbirçok komutta kullanıcı komut dosyalarını çalıştırmak için en yaygın kullanılan terimdir . Ancak, aşağıdakiler gibi diğer kabukları vardır Korn (ksh), C shell (csh)ve Z shell (zsh), ama biz bir tartışma olarak burada onlara girmeyeceğim shve bashUbuntu en alakalı. Buradaki harika bir IBM makalesi , Linux'taki mermilerin evrimi hakkında daha ayrıntılı olarak ele alınıyor ve kabuk mimarisini ve mermilerin nasıl farklılaştığını açıklıyor.

Kabuk Betiği

ShStephen Bourne tarafından geliştirilen orijinal Unix kabuğu; Ancak Debian tabanlı sistemler ve Ubuntu dash, shkabukları olarak görüyor ( shaslında birbirine bağlı dash). Debian ve Ubuntu'da, hızı nedeniyle sh, kritik sistem prosedürleri ve başlangıçta anahtar komut dosyaları çalıştırmak için daha sık kullanılır; Daha fazla ayrıntı için Ubuntu wiki'sine bakınız . BashBourne Again SHell anlamına gelir ve daha sonra Brian Fox tarafından geliştirildi ve orijinali genişletti sh. Fox ve diğerlerinin gelişimi Bash, GNU projesinin önemli bir parçasıydı. Daha fazla bilgi için tarihin bu büyük tartışmasına bakın Bash.

Hem dikkat etmek önemlidir shve BashUbuntu ve diğer dağılımlar kullanılan, vardır POSIXonlar komutlar Kabuğu'nda yürütür nasıl standartların bir dizi abone anlamına gelir uyumlu. Bu, işletim sisteminde kullanılan komut dosyalarının sonuçlarının güvenilir bir şekilde tahmin edilebildiğinden ve kabuğun davranışının bu POSIXgeliştiriciler için özellikle önemli olduğundan, bu parametreler içinde tutulmasını sağlamaktır. Standartlar hakkında daha fazla bilgi için resmi belgelere bakın .

Genellikle kabuk komut dosyaları, komut dosyaları .sholarak çalıştırılmak üzere tasarlanmış olmaları ve komut dosyasının üstünde olmalarına rağmen , soneklere bashsahiptir #!/bin/bash. Komut dosyasının script.sh veya my.script olarak adlandırılmasının önemi yoktur , tercüman aramasının /bin/shya da olması önemli değil /bin/bash. Kabuk komut dosyaları, komut satırında ya shda ile çağrılabilir bash.

Bununla birlikte, çoğu komutun işe yarayacağından , hangi tercümanın çağrıldığına bağlı olarak sonuçların farklı olabileceğine dikkat etmek önemlidir . Genel olarak, çoğu kullanıcı , genişletilmiş özellik kümesinden yararlanabilmeleri için komut dosyaları için kullanmak isteyecektir ; gerekirse sistem komut dosyaları ile çalıştırılabilir .bashshshbash/bin/bash/bin/sh

Bash Shell komut dosyası için kaynaklar

Çevrimiçi olarak iyi uygulamaları izleyen ve yararlı komut dosyaları oluşturmanıza olanak sağlayacak tavsiyeler veren faydalı kaynakları bulmak bazen zor olabilir. Sonrasında man bash, en önemli kaynaklardan bazıları Greg'in wiki'si , Bash hacker'ları ve Steve Parker'ın Shell Scripting konusundaki son kitabıdır Bashve O'Reilly tarafından basılmıştır. Bash yeni başlayanlar için iyi bir giriş yapılıyor .


2
Bu cevap benimkinden daha üstün (kabul edilen cevap), benimki bundan bir hafta önce geldi.
Hilton Shumway

4

Ubuntu, benzerleri için kullanılabilir birden kabukları vardır bash, zsh, ksh, tcshve csh.

Yani ne zaman biri kabuk demişse , onlardan biri hakkında konuşuyor Ancak, bu kabukları birbirinden biraz farklıdır. Bu yüzden, biri bashkomut dosyası yazmaktan bahsettiğinde , bir kabuk kullanıyor, ancak birisi kabuk komut dosyası yazmaktan bahsettiğinde, kullanmıyor bash. Ancak bash, genellikle Ubuntu için komut dosyalarında kullanıldığı gibi , genellikle öyledir. Üstelik, farklı mermiler birçok açıdan aynıdır, bu yüzden genellikle önemli değildir.


2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

Bu, 'sh' ifadesinin 'dash' simgesine bir bağlantı olduğunu ve Ubuntu'daki varsayılan etkileşimli kabuk olan / bin / bash komutunun / bin / sh değerinden 9 kat daha büyük bir çalıştırılabilir olduğunu gösterir.

Gerçekten de, 'man sh' (1590 satır) ile 'man bash' (5459 satır), bash'ın geleneksel 'sh' büyük bir süperset olduğunu ortaya koyuyor.

Daha fazlasını buradan okuyun:


2

Kabuk betiği , POSIX uyumlu işletim sistemlerinin sistem kabuğu tarafından çalıştırılabilecek bir taşınabilirlik odaklı komut dosyası olarak tanımlanır . Sözdizimi, POSIX standardı tarafından tanımlanan kabuk komut dosyası dili sözdizimi ile aynı veya benzer olacaktır. Bu, Linux / Unix / * BSD vb. Gibi POSIX uyumlu çoğu işletim sistemi için standarttır. POSIX, İşletim Sistemleri arasında uyumluluk için en yaygın temeldir.

Yukarıda belirtilenlerden farklı işletim sistemleri, #! /bin/shPOSIX komutlarını ve sözdizimini uygulamanın yanı sıra, kendi uzantılarına sahip olan veya muhtemelen daha az kullanışlı özelliklerden çıkarılabilen etkileşimli olmayan kullanım için (ör. Shebang kullanan sistem komut dosyalarını veya komut dosyalarını çalıştırmak için) farklı kabuklar uygular. performans nedenleriyle, ancak POSIX zeminleri, farklı POSIX uyumlu Os'lar için tasarlanmış komut dosyalarının çok yüksek düzeyde taşınabilirliğini sağlar.

Yukarıda belirtilen işletim sistemlerinin çoğu, genellikle tam özellikli bash olan ayrı bir etkileşimli kabuğa sahiptir . Bash, POSIX uyumludur, fakat büyük bir ek komutlar havuzuna sahiptir ve farklı sözdizimlerini destekler. Bash'i --posix komut satırı seçeneğiyle başlatmak veya Bash çalışırken 'set -o posix'i çalıştırmak, Bash'in varsayılan olduğu yerlerde POSIX tarafından belirtilen davranışla eşleşecek davranışı değiştirerek Bash'in POSIX standardına daha yakın olmasına neden olacaktır. farklıdır, bkz: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Shebang belirteci ve Unix benzeri işletim sistemlerinde kabuk çalıştırılabilir dosyaları için tek biçimli yollar

Kabuklar için çalıştırılabilir dosyalar yerleştirme konusundaki tek biçimli kurallar sayesinde (genellikle '/ bin /' dizininde bulunurlar), kabuk komut dosyaları oluşturmak için tek biçimli kurallara sahip olabiliriz, daha özel olarak, shebang ifadesinde hangi yolu göstereceğimizi açıkça belirledik betiği çalıştırmak için uygun bir kabuk çalıştırılabilir. Unix / Linux / * BSD dosya sistemleri dahili olarak uzantıları desteklemez, bu nedenle dosya uzantıları yalnızca ek bir ipucu olarak veya dizin oluşturma amacıyla kullanılır.

Özellikle Debian / Ubuntu'da , bir çizgi kabuğunun çalıştırılabilir bin/sholduğuna işaret eden bir işaret bağlantısıdırbin/dash . Bu, daha hızlı olan ve daha işlevsel olan bash'ten ~ 1/10 büyüklüğünde olan tahmin edilen sistem kabuğunu çizer. kaynak: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash

Debian / Ubuntu interaktif terminali yolu da tekdüze olduğu diğer birçok Unix benzeri işletim sistemleri, bash, olduğu gibi varsayılan olarak: /bin/bash.

POSIX.1-2017 standardı: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

Genel kural şöyle olurdu:

Bir komut veya seçenek POSIX tarafından tanımlanmamışsa #! /bin/sh, ilk etapta bir komut dosyasına koymayın.

Komut dosyanızı dönüştürün veya hataları kontrol edin

Komut dosyanızı bash'tan POSIX formuna dönüştürmek için, kabuk komut dosyanızdaki hataları otomatik olarak kontrol etmek veya POSIX ile uyumlu hale getirmek için bash komut dosyasında hangi değişiklikleri yapmanız gerektiğini görmek isteyebilirsiniz:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism


1
Oldukça iyi cevap, +1. AskUbuntu'ya Hoşgeldiniz!
Sergiy Kolodyazhnyy

1
Dash ile ubuntu'daki / bin / sh olarak, bunun için de alıntı isteyebileceğiniz bir makale var. Ayrıca askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy
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.