Saya ingin menyesuaikan fungsionalitas cd
perintah sesuai kebutuhan saya.
Saya mendefinisikan fungsi berikut -
function cd () { cd "$@" && pushd "$@"; }
Tujuan dari fungsi ini adalah untuk secara otomatis mendorong direktori ke tumpukan sehingga menghemat upaya saya untuk mengetik secara manual pushd .
setiap waktu.
Namun, fungsi di atas adalah fungsi rekursif tanpa batas, karena panggilan untuk cd
diartikan sebagai fungsi itu sendiri dan bukan cd
built-in.
Bagaimana cara mereferensikan cd
built-in pada fungsi ini?
Saya tahu bahwa alias dapat dihindari dengan menggunakan \
. Apa cara untuk menghindari fungsi atau referensi bawaan dengan cara yang lebih eksplisit?
Catatan: Saya tidak ingin mengubah nama fungsi saya menjadi hal lain.
bash
shell-script
shell-builtin
Kshitiz Sharma
sumber
sumber
alias cd=pushd
? Apa yang Anda harapkan terjadi ketika Anda melakukan sesuatu yang bukan jalur absolut (misalnya,cd ../
)?pushd
tidak mendukung-P
. Tapi Anda benar, seperti yang ditunjukkan dalam pertanyaan itufunction cd
terlihat agak salah, karena mengubah direktori dua kali.Jawaban:
The
command
pasukan builtin nama perintah yang akan ditafsirkan sebagai builtin atau perintah eksternal (skipping alias dan fungsi lookup). Ini tersedia di semua shell POSIX termasuk bash.(Perhatikan bahwa contoh ini buruk: contoh ini tidak berfungsi dengan jalur relatif, dan Anda mungkin cukup mengetikkan saja
pushd
.)Di bash dan zsh (tetapi bukan ksh), Anda bisa menggunakan
builtin
untuk memaksa nama perintah untuk ditafsirkan sebagai builtin, tidak termasuk alias, fungsi, dan perintah eksternal.sumber
Bash memiliki perintah (builtin)
builtin
, yang melakukan apa yang Anda butuhkan. Mengganticd
denganbuiltin cd
fungsi Anda akan memperbaiki rekursi.sumber
Saya curiga ketika Anda mengatakan Anda "tidak ingin mengubah nama fungsi Anda menjadi hal lain," Anda bermaksud bahwa Anda ingin dapat memanggil fungsi Anda dengan nama yang sama dengan perintah aslinya.
Jadi, cara lain untuk melakukan ini yang juga berfungsi untuk hal-hal yang tidak built-in, adalah memberi nama fungsi Anda sesuatu yang lain, dan kemudian mendefinisikan alias untuk perintah yang dibungkus. Ini berfungsi karena alias tidak ada dalam konteks eksekusi fungsi Anda.
Contoh wrapper.sh:
Dan di, misalnya, .bash_aliases:
Tapi ini cukup berantakan. Penggunaan
command
lebih disukai bila memungkinkan.sumber
Agar ini bekerja dengan jalur relatif, berikut ini akan diperlukan:
Ini mengasumsikan Anda berada pada distro Linux yang cukup modern yang berisi utilitas 'realpath'. (RHEL 6 tidak misalnya). Jika Perl tersedia, 'realpath' dapat disimulasikan menggunakan:
sumber