'Dot space filename' komutu bash'ta ne yapıyor?


30

Bash shell kullanırken, ortam değişkenlerini bazen içeriğini kopyaladığım / yapıştırdığım bir metin dosyasında tutarım, örneğin exports.txt:

export FOO=bar
export FIZZ=buzz

Birisi bana kopyala / yapıştır yerine gösterdi, terminalde yazabilirim

. exports.txt

kopyala / yapıştır ile aynı etkiye sahip olacaktır.

Bu 'dot space dosyaadı' komutunun çalıştığı mekanizma nedir? Bunun için arama terimlerini düşünmek zor.

Ne olduğunu ve bu astarın ne yaptığının daha genel ayrıntılarını anlamak istiyorum.


23
Çalıştır help . Bu çok kısadır, Stack Exchange motoru yorum yapmak için çok kısa olduğunu düşünüyor.
Wildcard,

5
Neden tüm bu soruların bu sitede de ortaya çıktığını merak ediyorum. Stack Overflow , Ask Ubuntu ve Unix & Linux'ta birçok kez cevaplandılar .
fedorqui

Nokta-boşluk çalıştırmak için '. ' args, tek veya çift tırnak ile yazmanız gerekir . Aksi takdirde, işaretlenmemiş alan çizgiyi belirteçlere ayrıştırırken bash tarafından yenilir (bash kılavuzundaki "kelime bölme" konusuna bakın).
Peter Cordes

1
Bash olarak, için alternatif isim .olduğunu sourceanlamıyla bana en azından "bu dosyadan kaynak komutları," anlamına gelen.
jpaugh

Yanıtlar:


40

.( "Nokta") komutu ile eşanlamlı / kısayoldur kabuk yerleşik sourcekomutu.

Adı verilen kabuk betiğinin geçerli kabuk bağlamında (alt kabuk yerine) okunmasına ve yürütülmesine neden olur. Bu, kaynak kodlu betiğin, değişkenlerin ayarlanması ve kabuk fonksiyonlarının ve takma adların tanımlanması gibi çağıran kabuğun ortamının değiştirilmesine izin verir.


49
Aslında POSIX tanımlı "nokta" ( ) komutu sourceiçin standart olmayan ve taşınabilir olmayan bir eşanlamlı / kısayol, tam tersidir. .
terdon

8
bash standart dışı sağlar sourceve standart dışı .bu parçası olmasa bile geçerli dizini arama, her ikisi de POSIX olmayan modda $PATH. POSIX modunda, .geçerli dizinde arama yapmayan ve no source. Her iki modda da sourcePOSIX'in .komutu ile eşanlamlı değildir .
HVD

26

Mevcut iki cevap zaten mükemmel olsa da, etkinin en "dikkat çekici" olduğu noktanın eksik olduğu örneğini hissediyorum.

Diyelim ki script.shaşağıdaki içeriklere sahip bir dosyam var:

cd dir

Bu betiği normal olarak ( sh script.sh) çalıştırsaydım , şunu görürdüm:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

Ama senaryoyu ( . script.sh) nereden kaynaklayacak olursam, bununla sonuçlanır:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

İkinci durumda ana kabuğumuzun çalışma dizininin nasıl değiştiğine dikkat edin!

Kendi alt kabukta ilk örnek çalışır (diğer yanıtlar sivri out gibi) (Bunun nedeni shbiz ile başlayan süreç sh-Komut, bu temelde olabilirdi herhangi kabuk, bash, dash, aklınıza ne gelirse), orada dizini değiştirir, hiçbir şey yapmaz ve kapanır. İkinci örnek ana kabuğumuzu çalıştırırken, oradaki dizini de değiştirir!


4

İşte bir örnek.

Komut dosyası: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

Yukarıdaki değişkenlerden herhangi birini yazdırmaya çalışırsanız, hiçbir şey elde edemezsiniz.

echo $myvar

ama yaparsan

. mytest.sh

veya

source mytest.sh

ve sonra

echo $myvar

yazdırır 1

Spiff'in yazdıklarına dair görsel bir cevap.


Bu nedenle, örneğinizi yorumlamak export, yalnızca bu değişkenler alt kabuklarda kullanılacaksa kullanmaktır. exportDeğişkenler yalnızca geçerli kabukta kullanılacaksa dosyada atlayabilirim . Bu doğru mu?
iancoleman

1
Oldukça doğru ve ben evet diyebilirim. Bununla birlikte, dışa aktarma komutunun kullanılması, kabuk ortamı değişkenlerini düşünüyorsanız, daha faydalı veya daha anlaşılırdır. Örneğin, $ HOME veya $ DISPLAY. Evet, kabuk oturumunuzdaki veya alt kabuklarınızdaki bir değişkeni dışa aktarmak için dışa aktar komutunu kullanabilirsiniz, ancak bu oturumu sonlandırdığınız anda gider.
raism
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.