Bir komutun kabuktan önceki komuttaki anlamı nedir?


74

Android tutulması hata ayıklama öğretici takip ederken, ben komutları takip karşılaşıyorum.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Benim sorunum, önceki nokta ne build/envsetup.shanlama geliyor?

Yanıtlar:


78

Bu bağlamdaki bir nokta, bu dosyanın içeriğini geçerli kabuğa "kaynaklamak" anlamına gelir. İle sourcekendisi bir kabuk yerleşik komutu olma. Ve sourcenokta operatörü eşanlamlılar.

Örnek

Bir sample.shdosyada aşağıdaki içerikleri bulunduğunu söyleyin .

$ cat sample.sh 
echo "hi"
echo "bye?"

Şimdi kaynak yaptığımda:

$ . sample.sh 
hi
bye?
$

Bunun gibi dosyalar genellikle çevre değişkenlerine bir şeyler eklemek gibi kurulum komutlarını dahil etmek için kullanılır.

Örnekler

Diyelim ki bu komutları başka bir dosyada addvars.sh.

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

Şu anki kabuğumun ortamında hiçbir değişken olmadığına dikkat edin.

$ env | grep VAR
$

Şimdi bu dosyaya kaynak yaptığımda:

$ . addvars.sh 
$

Tamam, bir şey yapmış gibi görünmüyor, ancak envdeğişkenleri tekrar kontrol ettiğimizde :

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

70

Slm'nin cevabına eklemek için:

Bir kabuk betiğini çalıştırmanın iki yolu vardır. Bunlardan biri betiği ayrı bir işlemde çalıştırmaktır; bu, kabuğun ortamı (bellek durumu) ile ilgili herhangi bir şeyin, "alt" kabuk işlemini çalıştırmadan önce "üst" kabuğun durumuna döneceği anlamına gelir.

Örneğin, geçerli çalışma dizini (bir dosya sistemindeki konum) işlem başına belirlenir. Öyleyse şuna benzeyen bir senaryo yazalım:

#!/bin/bash
cd ~
cd ..
pwd

Öyleyse bu senaryoyu diyelim, oh foo. Ve şu komut dosyasını şu şekilde çalıştıralım:./foo

Aşağıdakileri göreceğiz:

/home

(Bazılarının kullanıcı dizinlerini koymadığı çok sayıda Linux ve diğer UNIX klonu dağıtımının standart olarak reddedilmesi /home. Veya "Sizin kilometreniz değişebilir" dediğimiz gibi)

Şimdi, bu betiği çalıştırdıktan sonra, bu komutu yazalım

pwd

Hangi dizinde olduğumuzu görmek için. Bunun gibi bir şey göreceğiz:

/home/username

Sebebi, yine koştuğumuz kabuk betiğinin kendi ortamı vardı (komutların çalıştığı kendi dizini de dahil) ve betiğin çalışması bittiğinde o ortam kayboldu.

Şimdi, foobetiği bu şekilde çalıştıralım

. ./foo

Veya eşdeğer olarak:

source ./foo

Daha pwdsonra yaparsak, şunu göreceğiz:

/home

Sebebi: Bir betiği kaynaklamak ayrı bir süreç değil. Ana işlemdeki tüm komutları elle yazmak gibi bir şeydir; komut dosyası bittikten sonra ortamı korunur.


Daha basit bir örnek bulmama izin verin. Şuna benzeyen bir senaryo yazalım:

#!/bin/bash
exit

Adını verelim foo. En bunu çalıştırabilirsiniz emin olalım: chmod 755 foo. O zaman, hadi şöyle koşalım:

./foo

Hiçbir şey olmuyor. Ancak, eğer bunu yaparsak:

. ./foo

Veya bu:

source ./foo

Çıkış yapıyoruz.


6
Cevabınız kabul edilenden daha iyi, nasıl anladığınızı anladım, teşekkürler!
Ahmed,

5

Nokta (nokta), yerleşik bash için kısa eldir source. Geçerli ortamdaki bir dosyadaki komutları okuyacak ve yürütecek ve yürütülen son komutun çıkış durumunu döndürecektir. Dosyalar geçerli dizinde veya içinde herhangi bir yerde olabilir PATH. Çalıştırılabilir olması gerekmez.


1

Nasıl öğrenilir?

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

Sanırım kılavuzda bir virgül eksik. “Geçerli kabuktaki bir dosyadan komutları yürütün” demelidir.
ctrl-alt-delor

1

. (kaynak veya nokta operatörü)
Geçerli kabuk bağlamında dosya adı bağımsız değişkenindeki komutları okuyun ve uygulayın.

Syntax
      . filename [arguments]

      source filename [arguments]

source, nokta / nokta 'ile eşanlamlıdır.' bash, ancak POSIX sh’de değil, bu nedenle maksimum uyumluluk için dönemi kullanın.

Bir komut dosyası, kaynak kullanılarak çalıştırıldığında, mevcut kabuk içinde çalışır, komut dosyası tarafından oluşturulan veya değiştirilen değişkenler, komut dosyası tamamlandıktan sonra kullanılabilir durumda kalır. Bunun aksine, komut dosyası bir dosya adı gibi çalıştırılırsa, komut dosyasını çalıştırmak için ayrı bir alt kabuk (tamamen ayrı bir değişkenler kümesiyle) oluşturulur.

Bir betiği çalıştırmak için, .ss64script (dot ss64script) ve. ss64script (nokta boşluğu ss64script)

ilki 'ls' komutundan gizlenmiş bir dosyayı çalıştırıyor, (ls -a gizli dosyaları gösterse de) ikinci seçenek chmod ile çalıştırılabilir olarak ayarlanmamış olsa bile ss64script'i çalıştırıyor.

Kaynak


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.