./Bla.sh vs. ile komut dosyasını çağırmak. bla.sh


11

Birisi bana aşağıdaki iki örnek A) ve B) 'de kabuğun ne yaptığını açıklayabilir mi? Açıkçası farklı davranıyor, ancak çıktının neden farklı olduğunu bulamıyorum.

Örnek:
Şu anki dizinimizde bla.shsadece bir komutla adlandırılmış bir komut dosyası alalım :
echo ${0##/*} hello

A)
Başlatan: ./bla.sh
verir:./bla.sh hello

B)
Başlatan: . bla.sh
verir:-bash hello

Bunu bir komut dosyasında kullandığım için, ikinci çıktı (-bash'in önündeki "-" yüzünden) komutu öldürür. Tabii ki, --önce basit bir ${...}yardımcı oldu, ama ilk etapta çıktı neden neyin olduğunu anlamak isterim.
Ben bash'ı seviyorum. Ve vi [m]. Ama konuya giriyorum…

Yanıtlar:


22
./bla.sh

Burada komut ./bla.sh. Bu, kabuğun bla.shgeçerli dizinde adlandırılmış bir yürütülebilir dosya aramasını sağlar , ardından çekirdekten, kabuktan ayrı bir işlemde normal bir program olarak çalıştırmasını isteyin. ( bla.shBir bashbetik, bir perlveya pythonbir veya derlenmiş bir ikili olması önemli değildir.)


. bla.sh

Burada, komut .(aka source), kabuğunuzun yerleşik bir komutudur. Kabuğun bla.shsistem yolunda ($ PATH) adlı bir dosyayı aramasını sağlar ve içeriği sizin tarafınızdan yazılmış gibi yorumlar; tüm bunlar kabuğun kendisi ile aynı süreçte yapılır (ve bu nedenle kabuğun iç durumunu etkileyebilir).

Bu elbette yalnızca kabuk bla.shiçin komutlar içerdiğinde çalışır bash(şu anda kullandığınız buysa), perlkomut dosyaları veya başka bir şey için çalışmaz .

(Bu açıklanmıştır help .ve help sourcede.)


As .ve ./tamamen farklı şeyler (bir yolun bir parçası vs bir komut), onlar, kombine edilebilir kursu - kullanarak . ./bla.sholur "kaynak" Dosya bla.shgeçerli dizinde.


Genellikle ./bla.shyöntemi kullanmak en iyisidir . Sadece ~/.bashrc, ~/.profileonlar şimdiki ortam değiştirmek gerekiyordu çünkü ve bu tür dosyaları genellikle, kaynak vardır.


3
Ayrıca, bla.sh ortamındaki bash ortamını değiştirirseniz, bu değişiklikler daha sonra dikkate alınır. bla.sh ama sonra değil ./bla.sh. Bunun nedeni ise . bla.sh geçerli bash bağlamında çalışır. .bla.sh ise bir alt işlem olarak çalışır.
mouviciel

1
Bazı örnekler için ayrıca bkz . Mywiki.wooledge.org/BashFAQ/060 . Bunun aksine sourcebir bash takma adı olduğunu .ve sourcediğer kabuklarda çalışmadığını unutmayın.
mrucci

7

./<cmd><cmd>geçerli dizinde bulunan programı yeni (çatallı) işlemde yürütür . Yürütülebilir olması gerekir. Ve ayrıca okunabilir ile başlar #!.

. <cmd>geçerli kabuğunuzun , geçerli kabuk işleminde <cmd>sizin $PATHveya geçerli dizinde bulunan kabuk komut dosyasını yürütmesini sağlar . Okunabilir olmalıdır. Shell komutu için bir takma addır .source


-1 . <cmd>programı arayacak $PATHve daha sonra bulunamazsa geçerli dizine bakacaktır.
dogbane

@dogbane Doğru, bunu düzelttim.
kmkaplan

FWIW, tüm kabuklar kaynak kodları için cwd'yi aramayacak. zsh (en azından sahip olduğum yapılandırma ile) gerektirir. ./cmd
bstpierre

1
@bstpierre Burası hareketli bir yer gibi görünüyor. Sahip olduğum POSIX başvurusu, “kabuk PATH tarafından belirtilen arama yolunu kullanacak” ve “Bazı eski uygulamalar, PATH değeri izin vermese bile dosya için geçerli dizinde arama yaptı” diyor.
kmkaplan

1

./cmd çalıştırılabilir için açık yol ( ./- current dir) kullanır. Ve bununla başlaması gerekli değildir #!.

. cmd- (aka source) - bash yerleşik komut. Yürütmenin görünür bir farkı source, geçerli kabuğun ortam değişkenini ayarlayabilmesi / değiştirebilmesidir.


daha kesin olarak, (standart) sourcesadece bash takma adı.
user1686

Haklısın. Sabit.
Leonid Volnitsky
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.