Bí danh Bash nên đi trong .bash_aliases
hoặc .bashrc
tập tin trong các thư mục nhà riêng lẻ. Nếu bạn phải tạo bí danh bash toàn cầu, họ có thể truy cập /etc/bash.bashrc
, nhưng tốt nhất là chỉ cần thêm chúng vào .bash_aliases
hoặc .bashrc
tệp /etc/skel
để chúng được người dùng mới tạo kế thừa.
Đó là hầu như luôn luôn sai để xác định một bí danh trong trong .profile
, .bash_profile
hoặc /etc/profile
.
Để hiểu lý do tại sao, người ta phải hiểu trong hoàn cảnh nào các lệnh từ mỗi tệp này được chạy. Có những quan niệm sai lầm về điều này, mà tôi giải quyết dưới đây.
Mặc dù bạn muốn xác định bí danh cho nhiều người dùng, bạn nên làm quen với cách xác định chúng cho từng người dùng, để bạn có thể quyết định phương pháp tốt nhất để làm những gì bạn cần.
Bí danh cho người dùng cá nhân
Đặc biệt nếu bạn sử dụng GUI, hầu hết các shell tương tác của bạn có thể là các shell không đăng nhập . Ngay cả khi bạn không bao giờ sử dụng GUI, bạn vẫn có thể sử dụng các shell không đăng nhập với một số tần số. Bạn sẽ muốn bí danh của bạn hoạt động trong các shell này.
Đặc biệt nếu bạn từng đăng nhập phi đồ họa trong bảng điều khiển ảo hoặc thông qua SSH , bạn có thể sử dụng shell đăng nhập một số thời gian. Vì vậy, bạn sẽ muốn bí danh của mình cũng hoạt động trong các vỏ đăng nhập tương tác.
Khi một vỏ tương tác, không đăng nhập bắt đầu , nó sẽ tìm nguồn .bashrc
trong thư mục chính của người dùng. Theo mặc định trong Ubuntu, mỗi .bashrc
nguồn của chính người dùng .bash_aliases
, nếu nó tồn tại.
- Để nguồn một tập tin là làm cho nội dung của nó được chạy trong shell hiện tại . Các thay đổi đối với môi trường shell được thực hiện trong một tệp có nguồn gốc vẫn tồn tại ngay cả sau khi tất cả các lệnh trong tệp đã được chạy.
Đọc các bình luận trong mặc định của Ubuntu .bashrc
cho thấy rằng mục đích chính thức là các bí danh đi vào .bashrc
hoặc .bash_aliases
. .bashrc
đã chứa một số định nghĩa bí danh (chạy grep '^[[:blank:]]*alias' ~/.bashrc
để xem chúng) và đưa ra lời khuyên rõ ràng về nơi đặt các định nghĩa mới như vậy:
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Nhưng những gì về shell đăng nhập tương tác ? Thay vì .bashrc
, đăng nhập nguồn vỏ .profile
.
- ... Trừ khi
.bash_login
tồn tại, sau đó nó sẽ có nguồn gốc.
- ... Trừ khi
.bash_profile
tồn tại, sau đó nó sẽ có nguồn gốc.
Tuy nhiên, tin tốt là theo mặc định trong Ubuntu, các lệnh trong cũng.bashrc
sẽ chạy trong các vỏ đăng nhập tương tác vì mặc định sẽ .profile
kiểm tra xem shell hiện tại có bị lỗi không (và nếu .bashrc
có), và nếu vậy, các nguồn .bashrc
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Tôi đề nghị người dùng xác định các bí danh bash mới trong .bash_aliases
thư mục nhà của họ (tạo nó nếu nó chưa tồn tại). Đây là một cách đặc biệt sạch sẽ và đơn giản để làm cho các định nghĩa bí danh vĩnh viễn ở cấp độ mỗi người dùng.
Bí danh không nên được xác định.profile
bởi vì chúng sẽ không được xác định trong các vỏ không đăng nhập. Không giống như phần lớn môi trường của bash shell, bí danh không được xuất sang shell con:
ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found
Cụ thể, theo mặc định, hầu hết các môi trường máy tính để bàn .profile
đều có nguồn gốc khi đăng nhập đồ họa, nhưng:
- Điều này không nhất thiết phải được thực hiện bởi bash shell, vì vậy các định nghĩa bí danh thậm chí có thể không được xử lý và quan trọng hơn
- ngay cả khi các định nghĩa bí danh được xử lý, chúng không được chuyển cho các tiến trình con . Đặc biệt, chúng không được truyền vào các shell được tạo bằng cách mở cửa sổ Terminal!
Bí danh không nên được định nghĩa trong .bash_profile
(hoặc .bash_login
) vì lý do rất giống nhau, mà còn vì một lý do khác. Dễ dàng tạo một trong những tệp này và chỉ đưa các định nghĩa bí danh vào đó sẽ ngăn không cho bất kỳ mã nào .profile
chạy!
Trong các tình huống .bash_profile
hoặc .bash_login
thực sự hữu ích, thường là một nguồn .profile
ở đâu đó trong đó, giải quyết vấn đề đó. (Sau đó, vấn đề duy nhất còn lại là, giống như .profile
, xác định bí danh trong .bash_profile
hoặc .bash_login
không hoạt động đúng.)
Bí danh cho người dùng cá nhân mới , tự động
Khi một tài khoản người dùng thuộc loại dự định đại diện cho một con người thực sự được tạo ra, một thư mục mới thường được tạo để phục vụ như thư mục chính của họ. Các nội dung /etc/skel
sau đó được sao chép vào thư mục nhà của họ. Đây là cách nhiều người dùng bắt đầu với một số tệp cấu hình tương tự trong thư mục chính của họ. Trong Ubuntu, điều này bao gồm .profile
, .bashrc
và một số file khác.
Để thay đổi những bí danh được xác định cho người dùng mới, bạn chỉ cần đặt chúng vào /etc/skel/.bash_aliases
(bạn sẽ phải tạo nó) hoặc /etc/skel/.bashrc
.
Nếu bạn chỉnh sửa một tệp đã tồn tại trong /etc/skel
bạn có thể muốn sao lưu nó trước - nhưng bạn không nên đặt bản sao lưu vào /etc/skel
, hoặc nó cũng sẽ được sao chép vào thư mục nhà của người dùng mới.
Đây có thể là cách tốt nhất để bạn thêm bí danh mới cho nhiều người dùng. Người dùng hiện tại có thể chỉ cần thêm các bí danh. Nếu bạn xác định các bí danh trong /etc/skel/.bash_aliases
, bạn có thể chỉ cần đưa chúng vào tệp đó, chúng có thể chọn sao chép vào thư mục chính của chúng (hoặc thêm vào .bash_aliases
tệp tùy chỉnh của riêng chúng ).
Thật là tầm thường khi người dùng xác định bí danh. Ngoài ra, bí danh không phải là cực kỳ mạnh mẽ ; họ chỉ làm việc trong hoàn cảnh cụ thể. Nếu bạn cần tạo một lệnh mới hoạt động mọi lúc, đối với mọi người , bạn không nên thực hiện lệnh đó dưới dạng bí danh. Và bạn không thể ép thành công bí danh đối với người dùng không muốn họ - họ có thể chỉ đơn giản là unalias
họ.
Bí danh toàn cầu, cho tất cả người dùng
Mặc dù tôi khuyên bạn nên tránh cách tiếp cận này, bạn có thể xác định bí danh trong tệp toàn cầu /etc/bash.bashrc
. Sau đó, chúng sẽ được xác định cả cho vỏ không đăng nhập tương tác và cho vỏ đăng nhập tương tác. Lý do là, trước khi bất kỳ tệp nào trong thư mục chính của người dùng có nguồn gốc:
- Shell đăng nhập (và chỉ shell đăng nhập và các quá trình khác hoạt động như shell đăng nhập)
/etc/profile
tự động chạy các lệnh .
- Chỉ các shell không đăng nhập mới chạy các lệnh
/etc/bash.bashrc
tự động, nhưng
- Ubuntu mặc định
/etc/profile
kiểm tra xem shell đang chạy có bash (và nếu /etc/bash.bashrc
có) và, nếu vậy, các nguồn /etc/bash.bashrc
.
Điều này tương tự như cách mỗi người dùng mặc định .profile
cung cấp nguồn cho mỗi người dùng .bashrc
nếu shell bị bash (như chi tiết ở trên).
Đây là mã thực tế cho cái này trông như thế nào trong mặc định /etc/profile
:
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
Khối đó cũng thực hiện các nhiệm vụ khác. Cụ thể, if
kiểm tra bên ngoài nếu shell có khả năng tương tác (bằng cách kiểm tra xem văn bản nhắc không trống), sau đó kiểm tra xem shell hiện tại có bash không và nguồn /etc/bash.bashrc
có hay không, và nếu không thì một số hoạt động đó, đối với bash , đã được thực hiện trong /etc/bash.bashrc
.
Bạn không nên xác định bí danh toàn cầu /etc/profile
vì cùng lý do người dùng không nên xác định chúng trong .profile
s cục bộ của họ : nếu bạn làm như vậy, chúng sẽ chỉ được xác định cho các vỏ đăng nhập chứ không phải cho các vỏ con của chúng.
Cuối cùng, lưu ý rằng, không giống như mỗi người dùng .bashrc
mặc định, /etc/bash.bashrc
tệp mặc định không chứa bất cứ điều gì về bí danh. Việc cung cấp bí danh cho người dùng trong một tệp mà họ không thể chỉnh sửa hoặc vô hiệu hóa chúng là điều hơi bất thường. (Tất nhiên, họ vẫn có thể làm điều đó, bằng cách ghi đè định nghĩa của chúng trong riêng địa phương của họ .bashrc
, .bash_aliases
hoặc ở nơi khác.)
Đọc thêm