Builtin cd ve cd komutları arasındaki fark nedir?


Yanıtlar:


41

cdKomut böylece normalde, yerleşik bir olduğu builtin cdaynı şeyi yapacaktır cd. Ancak cdbir işlev veya diğer ad olarak yeniden tanımlanırsa bir fark vardır, bu durumda cdişlevi / diğer adı çağırır, ancak builtin cddizini yine de değiştirir (başka bir deyişle, bir işlev tarafından tıkanmış olsa bile yerleşik olanı erişilebilir tutar.)

Örneğin:

user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd  # undefine function

Veya bir takma adla:

user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd  # undefine alias

Kullanmak builtin, bir cdşey yapan ve dizini değiştiren bir işlevi tanımlamak için de iyi bir yoldur (ondan cdçağırmak, işlevi sonsuz bir özyinelemede tekrar çağırmaya devam edeceğinden).

Örneğin:

user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd  # undefine function

5
+1 Örnekler burada özellikle açıklayıcıdır.
Tashus

2
Bir takma durumunda, arasında herhangi bir fark yoktur builtin cd mysubdirve \cd mysubdir?
gerrit

2
@gerrit Yalnızca adlı bir işlev varsa cd, bu durumda \cddiğer adı atlar ve işlevi çalıştırır. Bkz. Stackoverflow.com/a/16506263/4518341
wjandrea

15

Çoğu durumda, fark yoktur (ancak aşağıya bakınız). cdKomuttur yerleşik bir bütün kabuklarda komuta. Harici bir komut, çağrılan kabuğun ortamını değiştiremediği ve çalışma dizininin değiştirildiği ortamda bir değişiklik oluşturduğundan dahili 1 olmalıdır .

bashKomut builtinkuvvetleri kabuğu kullanmak yerleşik bir komut sürümü, aynı adı taşıyan mevcut bir kabuk işlevi, takma veya harici komut olabilir rağmen.

Orada durumda olan ada sahip bir kabuk işlevi örneğin cd, daha sonra builtin cdolurdu değil diyoruz. Kullanarak builtin cd, kullanıcı tarafından bir kabuk işlevi ya da diğer adıyla ilave edilen herhangi bir aşırı işlevselliği bypass.

Misal:

cdDahili komut istemi güncelleyen bir işlev tarafından aşırı yüklenmiş olabilir:

cd() {
    builtin cd "$@" && PS1=$(__update_prompt)
}

burada __update_prompt, bir dize çıktısı veren kullanıcı tarafından sağlanan başka bir işlev vardır.

builtin cdFonksiyonunda yinelemeli işlevi demezdim. builtin cdBu işlevin etkin olduğu bir kabukta kullanmak , ek olarak işlevi çağırmaz.


1 Harici komutlu Unices cd(macOS ve sanırım Solaris) var. Bu komut, amacı edilemez bir kabuk çalışma dizinini değiştirmek, listeleri POSIX standardını, karşılamak için olasılıkla cdmevcut olmalıdır dış araçlardan biri olarak ( cd"özel bir yerleşik araçlardan biri" değildir) . Ayrıca, çalışma dizinini belirli bir dizine değiştirmenin mümkün olup olmadığını görmek için bir test görevi görebilir .


FWIW, MacOS ayrıca harici bir cdkomutla işletim sistemi kategorisine girer .
yoann

@yoann Gerçekten de öyle.
Kusalananda

Teşekkür ederim - günümü birinci sınıf, iyi araştırılmış, dipnotlu bilgiçlikle yaptın.
james

Çoğu kabuk - bu execlineb için harici bir program, ama sonra cd kalan argümanlarını yürütecek
Grump
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.