“.” Kullanmak uygun mu? ve OS X'te .bashrc kaynak yerine dosyalar nasıl çalıştırılır?


11

Tamam, bu yüzden sourcekomut dosyasını geçerli kabukta ve .ayrı ayrı çalıştırır, komut dosyasını "." Ve "kaynak" ile çalıştırırken ayrıntılı olarak açıklanır , ancak, özellikle, benim .bashrcdosyamda, var:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

Bunu aşağıdakilerle değiştirebilir miyim:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

OS X üzerinde çalışacak mı - bu "POSIX" sorunu mu?

Ben denedim ve hala yukarıda (aslında her ikisi ile çalışmak, böylece Ubuntu üzerinde çalışmaya görünüyor sourceve .olduğunu, onlar bana kabuğunda istenen işlevselliği vermek). Birini diğerinden mi seçmeliyim yoksa bir şey mi kaçırıyorum?

FWIW, OS X'te, kaynak kodumu kendimden .bashrcaldım .bash_profile.


1
Eğer 'sh' esaslı mermiler ise '.' global uyumluluk için ve 'csh' tabanlı mermi kullanıyorsanız kaynak kullanırım.
mdpc

2
Bağlantılı yayının neresinde " sourcebetiği geçerli kabukta ve .ayrı ayrı çalıştırır " görüyor musunuz? Her ikisi de onu geçerli kabukta çalıştırıyor; aksi takdirde hiçbir anlamı olmaz
Michael Mrozek

Yanıtlar:


11

Bu POSIX tanımı içinde .dot:

Kabuk, geçerli ortamdaki dosyadan komutlar yürütür.

Dosya a içermiyorsa /<slash>, kabuk $PATHdosyayı içeren dizini bulmak için tarafından belirtilen arama yolunu kullanmalıdır . Normal komut arama aksine, dosya ile aranır .dot yarar gerek yok yürütülebilir olması. Okunabilir bir dosya bulunamazsa, etkileşimli olmayan bir kabuk iptal edilir; etkileşimli bir kabuk standart hataya bir tanı mesajı yazacaktır, ancak bu koşul bir sözdizimi hatası olarak kabul edilmeyecektir.

Yukarıdakileri göz önünde bulundurarak, sadece sizin [ -f ./file ] && source ./fileile . ./filetamamen değiştirebilirsiniz . Eğer dosya orada olmazsa, girişte bir bildirim alırsınız - muhtemelen sahip olmak istediğiniz bilgi, bence.

Elbette testi sürdürmeyi tercih ederseniz şunları yapabilirsiniz:

test -f ./file && . $_

2
Oh, insanlar biliyor $_, hoşuma gitti. :)
Andreas Wiese

@AndreasWiese - herkes yapmalı - POSIX tarafından tanımlanan sadece 7 özel parametreden biridir.
mikeserv

+1 test -f /.file && . $_Burada gösterilen yaklaşımı kullandım
Michael Durrant

6
@mikeserv Hayır, $_POSIX tarafından standartlaştırılmamıştır. 8 özel parametreler şunlardır $@, $*,$# , $$, $!, $?, $-ve $0. $_olduğu açıkça ihmal . Yanlış yorumun bir soruya yol açtı .
Gilles 'SO- kötü olmayı bırak'

19

In bash, .ve sourceeş anlamlıdır. bashKaynak kodu, dosyaya bakarak , aynı dahili işlevi builtin/source.defgörebilir .ve sourcekullanabilirsiniz source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source 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.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

Ancak sourcePOSIX uyumlu değildir, bu nedenle komut dosyanız POSIX ile çağrılırsa /bin/sh, .yerine kullanmanız gerekir source. POSIX kabuğu kısıtlamadığından yukarıdaki komut dosyanız çalışacaktır.

Şahsen ben her zaman .bunun yerine kullanıyorum source. (Yazdığım birçok senaryo altında cron).


Her şey eşit olduğunda, "" yerine "kaynak" kullanın. bir sebepten dolayı / grep için "." büyük bir komut dosyasında ifadeler. Bu bir kabus.
abonet

Her ne kadar bu cevap, @abonet'in dediği gibi, kullanımın neden kullanmanın .genellikle "daha iyi" olduğunu sourceaçıklasa da, sourcearamak çok daha kolaydır. Noktalar birçok dilde noktalama işareti olduğundan, gözün bunları atlaması kolaydır. Bu yüzden kullanmayı tercih ediyorum source.
Joe
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.