Hiểu .bashrc và .bash_profile


26

Trên máy chủ khi tôi đăng nhập bằng root tôi thấy .bashrc(Ubuntu 10.10).

Trên máy Mac của tôi, tôi có một .bash_profile

Có phải Ubuntu luôn chỉ có một .bashrctập tin và không .bash_profile? (Tôi chỉ bối rối, nên hỏi, tôi nhận ra họ khác nhau nhưng có lẽ có mối quan hệ nào đó?)

Trên máy chủ của tôi, tôi muốn tạo một bí danh, tôi có nên đặt nó vào .bashrckhông?

Điều gì sẽ xảy ra nếu tôi muốn bí danh này được áp dụng để tất cả người dùng có thể sử dụng nó?


1
có thể trùng lặp với: askubfox.com/questions/1528/bashrc-or-bash-profile - Tôi khuyên bạn nên thay đổi câu hỏi của mình để chỉ hỏi nơi đặt bí danh trên toàn cầu.

Câu trả lời:


39

Bí danh Bash nên đi trong .bash_aliaseshoặc .bashrctậ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_aliaseshoặc .bashrctệ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_profilehoặ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 .bashrctrong thư mục chính của người dùng. Theo mặc định trong Ubuntu, mỗi .bashrcnguồ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 .bashrccho thấy rằng mục đích chính thức là các bí danh đi vào .bashrchoặ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_logintồn tại, sau đó nó sẽ có nguồn gốc.
  • ... Trừ khi .bash_profiletồn tại, sau đó 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ẽ .profilekiểm tra xem shell hiện tại có bị lỗi không (và nếu .bashrccó), 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_aliasesthư 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:

  1. Đ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
  2. 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 .profilechạy!

Trong các tình huống .bash_profilehoặc .bash_loginthự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_profilehoặc .bash_loginkhô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/skelsau đó đượ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, .bashrcvà 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/skelbạ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_aliasestệ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à unaliashọ.

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/profiletự độ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.bashrctự động, nhưng
  • Ubuntu mặc định /etc/profilekiểm tra xem shell đang chạy có bash (và nếu /etc/bash.bashrccó) 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 .profilecung cấp nguồn cho mỗi người dùng .bashrcnế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ể, ifkiể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.bashrccó 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/profilevì cùng lý do người dùng không nên xác định chúng trong .profiles 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 .bashrcmặc định, /etc/bash.bashrctệ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_aliaseshoặc ở nơi khác.)

Đọc thêm


5

Đây là một số đọc tốt về nó. ".bash_profile được thực thi cho các shell đăng nhập, trong khi .bashrc được thực thi cho các shell không đăng nhập tương tác"

Vì vậy, đối với bí danh của bạn, hãy sử dụng .bash_profile


4
Đặt bí danh .bash_profilelà không chính xác. Trong Ubuntu, .profile(chạy cho shell đăng nhập) nguồn .bashrckhi nó là bash shell tương tác. Do đó, đặt bí danh vào .bashrc(hoặc .bash_aliases, có nguồn gốc .bashrc) xác định chúng trong tất cả các vỏ bash tương tác. Bí danh .bash_profilemang lại vấn đề này , trong số những người khác. Xem cái này , cái kia , câu trả lời của tôi và những ~/.bashrcbình luận mặc định khuyên bạn nên đặt bí danh ở đó hoặc vào .bash_aliases.
Eliah Kagan
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.