Neden bu kabuk betiğine ters eğik çizgi eklenmiş?


21

conda.shKomut dosyasının kopyasında aşağıdaki satırları görüyorum:

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi

Ben önünde bir ters eğik çizgi var neden olarak merak ediyorum diçinde dirname. Gerekli olduğuna inanmıyorum. Ters eğik çizgilerin bu kullanımı kaynak dosyadaki diğer yerlerde de görünür. Bunu yapmamın bir nedeni var mı?


Yanıtlar:


30

Ters eğik çizgi, takma adın genişlemesini engeller, yani orijinal komutu çalıştırır ve takma ad sürümünün çalışmadığından emin olur. Sistem ayarlandığında shopt -s expand_aliases(yalnızca BASH) veya kullanılarak yürütüldüğünde komut dosyaları bilmeden takma adın genişletilmesiyle çalışabilir source.

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion

Bazı sistem yöneticileri, istemeden başka bir yere takma isimlendirilmesi ve takma adın daha önce açıklandığı gibi genişletilmesi durumunda takma adların yan etkilerine karşı önleyici bir önlem olarak her şeye ters eğik çizgi koymak istemektedir. Örneğin, sistem bunu bir alias dirname='dirname -z'yere koymuşsa ve koşul, takma adın genişletilmesine izin veriyorsa, dirname çağırmaya çalışan bir komut dosyası ne yazık ki dirname -z, bunun yerine istenen komut dosyası değildi.

Bu takma adın bulunmadığına dair kesin bir şey varsa, tüm ters eğik çizgiyi kaldırabiliriz ve düzgün çalışması gerekir.

Alternatif olarak, bir commandtakma adı bastırmak için ters eğik çizgi yerine kullanabilirsiniz . Böylece, yerine \dirname, birini kullanabilirsiniz command dirnamedaha okunabilir bakmak olabilir. (Bunun gibi yerleşik komutlar cdiçin builtinbunun yerine biri kullanılmalıdır ). Bunun yerine, herhangi bir takma adın yanı sıra aynı adı taşıyan işlevi de atladığı için bunu tercih ederim.


1
Ayrıca unalias -a, tüm takma adları ortadan kaldıran, kayda değer bir şeydir.
Centimane

19
@Centimane Evet, ancak \unalias -atakma adın açılmasını engellemek için yaptığınızdan emin olun
Ben C

Sysadmin de yazmış olabilir /usr/bin/dirnamemi?
RonJohn

@RonJohn Evet, bu özel durumda alabilirdi. Ancak, bazı programlar için farklı dağıtımlar onları farklı dizinlere yerleştirmiştir. Akla gelen bir örnek , CentOS'taki /bin/edUbuntu'da /usr/bin/ed. Tam yola koymak, komut dosyasını daha az taşınabilir hale getirir.
doneal24

@ doneal24 DIRNAME=$(which dirname), whichtakma adlar görmediğinden ne gibi bir şey ?
RonJohn

20

Kaynaklanacak conda.shbir dosya ise, ters eğik çizgi diğer adı atlamak içindir. Bash, genellikle kod çalıştırma için takma ad genişletmesini devre dışı bırakır, ancak etkileşimli kabuklarda çalışabilen kaynaklı dosyalar için durum böyle değildir. Bu nedenle, sadece dirnamebir diğer ad adlı bir takma ad çalıştırabilir dirname, ancak \dirnamediğer ad genişlemesini atlar ve adında bir işlev veya komut çalıştırır dirname. (Sadece ters eğik çizgi değil, herhangi bir alıntı yapar.)


5
Veya command dirname.
Kusalananda

7
( \command dirname, sadece birinin commandaynı zamanda bir takma isim yapması durumunda .): |
muru

Neden takma adları atlıyor? Bu işlev bir şeyin özel bir hali mi, yoksa bash'a kodlanması mı gerekiyor (yani, bir hack)?
extremeaxe5

@ extremeaxe5 bash sözcüğü (herhangi bir kısmı) alıntı yaparsa takma ad genişletme yapmaz.
muru

1
@ extremeaxe5, bu özelliğin neden mevcut olduğunu soruyorsanız, bilmiyorum. Bu ise POSIX standardı Ancak: "komutu adı sözcüğü [...] bir olup olmadığını belirlemek için incelenir tırnaksız , geçerli takma adı"
muru
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.