Alias ​​tidak "menimpa" entri PATH?

9

Baris terakhir saya .bash_profileadalah:

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..?

javadba
sumber
1
Sebagai catatan: secara teknis, alias tidak menimpa nilai apa pun di PATHenvar.
can-ned_food
Peringatan wajib: Secara umum, bukan praktik yang baik untuk mengganti nama perintah umum. Ini bisa menggigit Anda dua cara. 1) Jika Anda bekerja pada sistem lain dan menggunakan perintah Anda dengan kebiasaan, Anda akan mendapatkan perilaku tak terduga dari perintah asli. 2) Jika orang lain menggunakan sistem Anda, bahkan untuk memberi saran / membantu Anda memecahkan masalah, mereka akan mendapatkan perilaku kustomisasi yang tidak terduga. Perintah khusus baik-baik saja, tapi jangan beri nama sama dengan yang sudah ada.
Joe
@ Jo Sebenarnya ini lebih dari terbalik di sini: versi os / x dari cp tidak memiliki opsi dari nix sehingga tidak berperilaku seperti yang diharapkan (kecuali untuk mereka yang * suka versi mac pincang)
javadba

Jawaban:

21

The whichperintah 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 cpAnda akan melihat semua interpretasi yang mungkin, sesuai urutan pilihan. Ini termasuk alias apa pun, karena typeini adalah bashperintah 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 cpfungsi, maka versi Anda akan berjalan dalam skrip, meskipun tidak dari program lain:

cp() { /usr/local/bin/gcp "$@"; }

Jika Anda ingin Anda cpbekerja di mana-mana, tambahkan $HOME/bindi bagian atas PATHdaftar Anda dan arahkan $HOME/bin/cpke titik itu:

ln -s /usr/local/bin/gcp $HOME/bin/cp

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 ke PATHvariabel akan dilakukan di salah satu bashskrip start-up, dengan izin pengguna.

AFH
sumber
1
Meskipun pada CentOS (dan AIUI semua RedHat) profil standar (kecuali diganti) membuat alias untuk whichyang berjalan /usr/bin/whichdengan input yang disalurkan dari output aliasdan opsi yang memberitahu itu untuk membaca input itu dan menggunakannya untuk menampilkan alias jika cocok dengan perintah. Lihat unix.stackexchange.com/questions/10525/…
dave_thompson_085
@ dave_thompson_085 - Komentar yang menarik: Saya belum pernah menggunakan distribusi itu. Saya menggunakan Ubuntu dan saya bisa mendapatkan banyak efek yang sama dengan hanya aliasing whichuntuk type. Kemudian which -aberoperasi seperti program eksternal, dengan penambahan alias dan definisi fungsi. Secara umum saya tidak alias which=type, karena saya suka menggunakan $(which ProgName)ketika saya ingin memaksa penggunaan program eksternal, melewati alias atau definisi fungsi.
AFH
1
Tautan keras tidak dapat melintasi sistem file, sehingga lnsaran 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 memperbarui gcp, karena tautan keras Anda mungkin masih akan merujuk ke versi yang lama.
berguna
@Useless - Poin valid, yang merupakan bagian dari mengapa saya mengedit jawaban saya untuk menyarankan tautan simbolis terlebih dahulu, meskipun saya berpikir bahwa izin mungkin merupakan pertimbangan yang paling penting. Adapun pembaruan 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.
AFH
1
@ can-ned_food - Tidak semudah mengaturnya di shell saat ini: harus disetel di setiap skrip, bersama dengan mengimpor alias.
AFH
13

Alias ​​bersifat internal ke shell. Program lain tidak akan tahu tentang mereka.

whichbukan Bash builtin (ini adalah builtin di beberapa shell lain, misalnya zsh). Karena whichtidak memiliki informasi istimewa ke alias Bash, whichcukup teliti PATHistilah yang diberikan.

type, di sisi lain adalah Bash bawaan, sehingga dapat melaporkan alias.

8bree
sumber
2
Dan, juga, alias hanya diperluas jika kata pertama dalam sebuah perintah. Mungkin itu tidak relevan.
can-ned_food