Kalau kamu pakai zoxide dan alias z tiba-tiba tidak ada di shell bash non-interaktif — cron job, script CI, atau subshell yang dibuat oleh tool lain — ini penjelasannya dan cara memperbaikinya.
Kenapa z tidak bekerja di shell bash non-interaktif
Saat kamu menjalankan eval "$(zoxide init bash)" di ~/.zshrc atau ~/.bashrc, perintah itu mendefinisikan shell function z untuk sesi interaktif. Tapi shell bash non-interaktif (yang dibuka dengan bash -c ... atau oleh tool secara internal) tidak menyource file-file itu. Mereka melewati .bashrc sepenuhnya.
Jadi z tidak pernah didefinisikan, dan kamu dapat command not found.
Solusinya: BASH_ENV
Bash punya satu hook untuk shell non-interaktif: environment variable BASH_ENV. Sebelum menjalankan perintah apapun, bash membaca dan menyource file yang ditunjuk oleh $BASH_ENV — tanpa flag khusus, tanpa konfigurasi tambahan.
Buat file env yang minimal:
echo 'export _ZO_DOCTOR=0' > ~/.bash_env
echo 'eval "$(zoxide init bash)"' >> ~/.bash_env
_ZO_DOCTOR=0 menekan peringatan yang dicetak zoxide saat mendeteksi shell non-interaktif. Harus ditulis sebelum eval.
Lalu export BASH_ENV dari shellmu agar diwarisi oleh setiap subprocess:
echo 'export BASH_ENV="$HOME/.bash_env"' >> ~/.zshrc
source ~/.zshrc
Selesai. Setiap subshell bash yang dibuat dari sesi terminal kamu sekarang akan punya z.
Verifikasi
cd /tmp && z nama-projekmu && pwd
Tidak ada peringatan, navigasi berjalan benar.
Kenapa tidak cukup tambahkan ke ~/.bashrc?
Shell bash non-interaktif tidak menyource ~/.bashrc. File itu hanya dibaca oleh shell bash interaktif non-login. BASH_ENV adalah satu-satunya hook resmi yang disediakan bash untuk shell non-interaktif.
Jaga ~/.bash_env tetap minimal — hanya yang benar-benar kamu butuhkan di konteks non-interaktif. Jangan dump seluruh konfigurasi shellmu ke sana; file ini dijalankan di setiap invokasi bash.