Açıkça yerleşik bir kabuk nasıl çağrılır?


14

cdKomutun işlevselliğini ihtiyaçlarıma göre özelleştirmek istiyorum .

Aşağıdaki işlevi tanımladım - function cd () { cd "$@" && pushd "$@"; }

Bu işlevin amacı, dizini otomatik olarak yığının üzerine itmektir, böylece pushd .her seferinde elle yazma çabasını kurtarır .

Bununla birlikte, yukarıdaki işlev sonsuz bir özyinelemeli işlevdir, çünkü çağrı çağrısı yerleşik cddeğil, işlevin kendisi olarak yorumlanır cd.

cdBu işlevdeki yerleşik öğeye nasıl başvurabilirim?

Takma adların kaçabileceğini biliyorum \. İşlevlerden kaçmanın veya yerleşiklere daha açık bir şekilde referans vermenin yolu nedir?

Not: İşlevimi başka bir şeyle yeniden adlandırmak istemiyorum.


3
Neden sadece alias cd=pushd? Mutlak yol olmayan bir şeye (örneğin, cd ../) geçtiğinizde ne olmasını beklersiniz ?
Patrick

@ Patrick pushddesteklemiyor -P. Ama haklısın, soruda gösterildiği gibi, function cddizini iki kez değiştirdiği için biraz yanlış görünüyor.
Tino

Yanıtlar:


6

commandYerleşik kuvvetleri bir komut adı, bir yerleşiği veya dış komut (diğer adı ve işlev arama atlama) olarak yorumlanmalıdır. Bash dahil tüm POSIX mermilerinde mevcuttur.

cd () { command cd "$@" && pushd "$@"; }

(Bu örneğin kötü bir örnek olduğunu unutmayın: göreli yollarla çalışmaz pushdve ilk etapta da yazabilirsiniz .)

Bash ve zsh'de (ksh değil), builtindiğer adlar, işlevler ve harici komutlar hariç bir komut adını yerleşik olarak yorumlanmaya zorlamak için kullanabilirsiniz .


16

Bash'in builtintam olarak ihtiyacınız olanı yapan bir (yerleşik) komutu vardır. İşlevinizde cdile değiştirmek builtin cdözyinelemeyi düzeltir.


1

"İşlevinizi başka bir şeyle yeniden adlandırmak istemiyorsanız" dediğinde, işlevinizi orijinal komutla aynı adla çağırabileceğinizi kast ediyorum.

Bu nedenle, yerleşik olmayan şeyler için de çalışan bunu yapmanın başka bir yolu, işlevinize başka bir şey adlandırmak ve sonra kaydırılan komut için bir diğer ad tanımlamaktır. Bu, takma ad işlevinizin yürütme bağlamında bulunmadığı için çalışır.

Örnek wrapper.sh:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

Ve örneğin .bash_aliases içinde:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

Ama bu oldukça acayip. commandMümkün olduğunda kullanmak tercih edilir.


-1

Bunun göreli yollarla çalışması için aşağıdakiler gerekir:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

Bu, 'realpath' yardımcı programını içeren yeterince modern bir Linux dağıtımında olduğunuzu varsayar. (RHEL 6, örneğin değildir). Perl varsa, 'realpath' şu şekilde simüle edilebilir:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}
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.