Baris terakhir saya .bash_profile
adalah:
alias cp=/usr/local/bin/gcp
Namun itu sedang tergencet oleh entri di saya $PATH
:
$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'
Saya berpikir bahwa alias menimpa PATH
..?
bash
alias
bash-alias
javadba
sumber
sumber
PATH
envar.Jawaban:
The
which
perintah kembali hanya executables: ia tahu apa-apa tentang alias, karena merupakan program eksternal, dan tidak ada mekanisme untuk menyampaikan informasi alias untuk proses anak.Jika Anda memasukkan perintah,
type -a cp
Anda akan melihat semua interpretasi yang mungkin, sesuai urutan pilihan. Ini termasuk alias apa pun, karenatype
ini adalahbash
perintah internal.Penting untuk menyadari bahwa alias tidak akan ditafsirkan oleh sub-proses, seperti skrip atau editor interaktif yang memiliki opsi untuk menjalankan perintah sistem.
Jika Anda membuat
cp
fungsi, maka versi Anda akan berjalan dalam skrip, meskipun tidak dari program lain:Jika Anda ingin Anda
cp
bekerja di mana-mana, tambahkan$HOME/bin
di bagian atasPATH
daftar Anda dan arahkan$HOME/bin/cp
ke titik itu:Ini membuat tautan simbolik, meskipun Anda bisa membuatnya menjadi tautan keras yang sedikit lebih efisien (dihilangkan
-s
), tetapi ini biasanya membutuhkan izin root (sudo ln ...
). Membuat fungsi dan menambahkan kePATH
variabel akan dilakukan di salah satubash
skrip start-up, dengan izin pengguna.sumber
which
yang berjalan/usr/bin/which
dengan input yang disalurkan dari outputalias
dan opsi yang memberitahu itu untuk membaca input itu dan menggunakannya untuk menampilkan alias jika cocok dengan perintah. Lihat unix.stackexchange.com/questions/10525/…which
untuktype
. Kemudianwhich -a
beroperasi seperti program eksternal, dengan penambahan alias dan definisi fungsi. Secara umum saya tidakalias which=type
, karena saya suka menggunakan$(which ProgName)
ketika saya ingin memaksa penggunaan program eksternal, melewati alias atau definisi fungsi.ln
saran non-simbolis hanya akan berfungsi jika direktori home Anda berada pada sistem file yang sama/usr/local/bin
. Ini juga akan berperilaku aneh jika Anda memperbaruigcp
, karena tautan keras Anda mungkin masih akan merujuk ke versi yang lama.gcp
, itu akan tergantung apakah pembaruan dilakukan dengan membuka dan menulis atau dengan menghapus dan menciptakan kembali. Perhatikan bahwa tidak penting apakah jalur sumber absolut atau relatif digunakan untuk membuat tautan keras, sedangkan tautan simbolik biasanya membutuhkan jalur absolut. Tautan digunakan secara luas di OS, dan sebagian besar simbolis.Alias bersifat internal ke shell. Program lain tidak akan tahu tentang mereka.
which
bukan Bash builtin (ini adalah builtin di beberapa shell lain, misalnya zsh). Karenawhich
tidak memiliki informasi istimewa ke alias Bash,which
cukup telitiPATH
istilah yang diberikan.type
, di sisi lain adalah Bash bawaan, sehingga dapat melaporkan alias.sumber