Bí danh không ghi đè lên các mục nhập PATH?


9

Dòng cuối cùng của tôi .bash_profilelà:

alias cp=/usr/local/bin/gcp

Tuy nhiên, điều đó đang bị đè bẹp bởi mục trong $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

Tôi đã nghĩ rằng bí danh ghi đè lên PATH..?


1
Đối với bản ghi: về mặt kỹ thuật, các bí danh không ghi đè bất kỳ giá trị nào trong PATHenvar.
can-ned_food

Cảnh báo bắt buộc: Nói chung, việc đổi tên các lệnh thông thường là không tốt. Điều này có thể cắn bạn hai cách. 1) Nếu bạn làm việc trên một hệ thống khác và sử dụng lệnh của bạn theo thói quen, bạn sẽ nhận được hành vi bất ngờ của lệnh gốc. 2) Nếu bất cứ ai khác sử dụng hệ thống của bạn, thậm chí để tư vấn / giúp bạn giải quyết vấn đề, họ sẽ nhận được hành vi bất ngờ trong tùy chỉnh của bạn. Các lệnh tùy chỉnh là tốt, chỉ cần không đặt tên chúng giống như các lệnh hiện có phổ biến.
Joe

@joe Thật ra thì ngược lại ở đây: phiên bản os / x của cp thiếu các tùy chọn từ nix nên nó không hoạt động như mong đợi (ngoại trừ những người * thích phiên bản mac bị
rối loạn

Câu trả lời:


21

Các whichlệnh trả về chỉ thực thi: nó không biết gì về bí danh, vì nó là một chương trình bên ngoài, và không có cơ chế để chuyển thông tin bí danh để một quá trình con.

Nếu bạn nhập lệnh, type -a cpbạn sẽ thấy tất cả các giải thích có thể, theo thứ tự ưu tiên. Điều này bao gồm bất kỳ bí danh, vì typelà một bashlệnh nội bộ.

Điều quan trọng là phải nhận ra rằng một bí danh sẽ không được giải thích bởi một quy trình phụ, chẳng hạn như tập lệnh hoặc trình soạn thảo tương tác có tùy chọn để chạy các lệnh hệ thống.

Nếu bạn tạo cpmột chức năng, thì phiên bản của bạn sẽ chạy trong các tập lệnh, mặc dù không phải từ các chương trình khác:

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

Nếu bạn muốn bạn cplàm việc ở mọi nơi, hãy thêm $HOME/binvào đầu PATHdanh sách của bạn và $HOME/bin/cpchỉ vào nó:

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

Điều này tạo ra một liên kết tượng trưng, ​​mặc dù bạn có thể làm cho nó một liên kết cứng hiệu quả hơn một chút (bỏ qua -s), nhưng điều này thường sẽ cần quyền root ( sudo ln ...). Tạo một hàm và thêm vào PATHbiến sẽ được thực hiện trong một trong các bashtập lệnh khởi động, với sự cho phép của người dùng.


1
Mặc dù trên CentOS (và AIUI tất cả RedHat), cấu hình tiêu chuẩn (trừ khi bị ghi đè) tạo ra một bí danh cho whichhoạt động /usr/bin/whichvới đầu vào được lấy từ đầu ra aliasvà một tùy chọn cho nó đọc đầu vào đó và sử dụng nó để hiển thị bí danh nếu nó khớp với chỉ huy. Xem unix.stackexchange.com/questions/10525/ trên
dave_thedom_085

@ dave_thndry_085 - Nhận xét thú vị: Tôi chưa sử dụng các bản phân phối đó. Tôi sử dụng Ubuntu và tôi có thể nhận được nhiều tác dụng tương tự bằng cách đơn giản aliasing whichđể type. Sau đó which -ahoạt động như chương trình bên ngoài, với việc bổ sung các định nghĩa bí danh và hàm. Nói chung tôi không alias which=type, vì tôi thích sử dụng $(which ProgName)khi tôi muốn sử dụng một chương trình bên ngoài, bỏ qua bất kỳ định nghĩa bí danh hoặc hàm.
AFH

1
Liên kết cứng không thể vượt qua các hệ thống tệp, do đó, lnđề xuất phi biểu tượng sẽ chỉ hoạt động nếu thư mục chính của bạn nằm trên cùng hệ thống tệp như /usr/local/bin. Nó cũng sẽ hoạt động kỳ quặc nếu bạn cập nhật gcp, vì liên kết cứng của bạn có thể vẫn sẽ đề cập đến phiên bản cũ.
Vô dụng

@ Vô dụng - Điểm hợp lệ, đó là một phần lý do tại sao tôi chỉnh sửa câu trả lời của mình để đề xuất một liên kết tượng trưng trước tiên, mặc dù tôi nghĩ rằng các quyền có thể là sự cân nhắc quan trọng nhất. Đối với việc cập nhật gcp, nó sẽ phụ thuộc vào việc cập nhật được thực hiện bằng cách mở và viết hoặc bằng cách xóa và tạo lại. Lưu ý rằng nó là không quan trọng cho dù đường dẫn nguồn tuyệt đối hay tương đối được sử dụng để tạo liên kết cứng, trong khi liên kết tượng trưng thường cần một đường dẫn tuyệt đối. Liên kết được sử dụng rộng rãi trong HĐH và chúng chủ yếu mang tính biểu tượng.
AFH

1
@ can-ned_food - Không đơn giản như đặt nó trong trình bao hiện tại: nó phải được đặt trong mỗi tập lệnh, cùng với việc nhập các bí danh.
AFH

13

Bí danh là nội bộ cho vỏ. Các chương trình khác sẽ không biết về chúng.

whichkhông phải là nội dung Bash (nó là nội dung trong một số shell khác, ví dụ zsh). Vì whichkhông có thông tin đặc quyền vào bí danh của Bash, whichchỉ cần xem qua PATHthuật ngữ đã cho.

type, mặt khác một nội dung Bash, vì vậy nó có thể báo cáo về bí danh.


2
Và, cũng, bí danh chỉ được mở rộng nếu từ đầu tiên trong một lệnh. Có lẽ điều đó không liên quan.
can-ned_food
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.