Tại sao ~ / .bash_profile của tôi không hoạt động?


35

Tôi đang sử dụng Linux Mint. Shell đăng nhập của tôi ( cat /etc/passwd | grep myUserName) là bash.

Sau khi tôi khởi động môi trường máy tính để bàn đồ họa của mình và chạy trình giả lập thiết bị đầu cuối từ nó, tôi có thể thấy đó .bash_profilekhông phải là nguồn gốc (các vars môi trường có exported trong đó không được đặt). Nhưng nếu tôi đăng nhập từ bảng điều khiển văn bản ( ctrl+ alt+ F1) hoặc chạy thủ công bash -ltừ trình giả lập thiết bị đầu cuối, sẽ .bash_profilehoạt động tốt.

Tôi có sai không khi tôi nghĩ rằng .bash_profilenên có nguồn gốc khi X bắt đầu và tất cả các exportvars ed nên có sẵn trong thiết bị đầu cuối, chạy từ X?

PS Đặt mọi thứ vào .bashrcvà tìm nguồn cung ứng từ đó .bash_profilekhông phải là ý tưởng hay ( https://stackoverflow.com/questions/902946/ ): công cụ môi trường chỉ nên được lấy nguồn một lần.

Câu trả lời:


38

Các tập tin ~/.bash_profileđược đọc bởi bash khi nó là một vỏ đăng nhập. Đó là những gì bạn nhận được khi đăng nhập ở chế độ văn bản.

Khi bạn đăng nhập dưới X, các tập lệnh khởi động được thực thi bởi /bin/sh. Trên Ubuntu và Mint, /bin/shdấu gạch ngang , không phải bash. Cả Dash và bash đều có cùng các tính năng cốt lõi, nhưng dash bám vào các tính năng cốt lõi này để nhanh và nhỏ trong khi bash thêm rất nhiều tính năng với chi phí đòi hỏi nhiều tài nguyên hơn. Người ta thường sử dụng dấu gạch ngang cho các tập lệnh không cần các tính năng bổ sung và bash để sử dụng tương tác (mặc dù zsh có nhiều tính năng đẹp hơn ).

Hầu hết các kết hợp của quản lý hiển thị (các chương trình mà bạn gõ tên bạn dùng và mật khẩu) và môi trường máy tính để bàn đọc ~/.profiletừ các kịch bản đăng nhập trong /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionhoặc bất cứ áp dụng. Vì vậy, đặt định nghĩa biến môi trường của bạn trong ~/.profile. Đảm bảo chỉ sử dụng cú pháp mà dash hỗ trợ.

Vậy bạn nên đặt ở đâu?

  • Một .bash_profiletải tốt .profile, và tải .bashrcnếu vỏ tương tác.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • Trong .profile, đặt định nghĩa biến môi trường và các cài đặt phiên khác như ulimit.

  • Trong .bashrc, đặt các cài đặt tương tác bash như bí danh, hàm, hoàn thành, các ràng buộc chính (không có trong đó .inputrc),

Xem thêm Sự khác biệt giữa Shell đăng nhập và Shell không đăng nhập? Thay thế cho .bashrc .


nhiều điều học được từ câu trả lời duy nhất :)
mtk

16

.bash_profilelà tập lệnh cấu hình khởi động của bash. Không tồn tại tiêu chuẩn bắt buộc X vào nguồn .bash_profile.

Những gì bạn đang nghĩ là khá .profile. Ban đầu nó là tập tin cấu hình khởi động của bourne shell (sh). Ngày nay, nhiều bản phân phối có môi trường máy tính để bàn của họ được thiết lập thành nguồn .profile. Lưu ý rằng đây cũng không phải là một tiêu chuẩn, nhưng nó dường như là một quy ước.

Debian đã từng sử dụng nguồn .profilekhi đăng nhập đồ họa ( trang wiki kể từ năm 2013 ), hiện tại nó không có ( trang wiki kể từ năm 2016 ).

Nguồn Arch .xprofilekhi đăng nhập đồ họa ( trang wiki vào năm 2013 ).

Ubuntu đã từng không khuyến khích sử dụng .profile( trang wiki kể từ năm 2013 ), giờ đây nó không còn khuyến khích nữa ( trang wiki kể từ năm 2016 ).


Về câu hỏi khác của bạn: Tại sao ~ / .bash_profile của tôi không hoạt động? Đó là hành vi dự kiến.

Tóm lại, hành vi như sau:

  • bash bắt đầu như một vỏ đăng nhập tương tác: đọc ~/.profile
  • bash bắt đầu như một vỏ không đăng nhập tương tác: đọc ~/.bashrc

Để biết thêm chi tiết, hãy xem câu trả lời của tôi cho một câu hỏi tương tự trong Askubfox: https://askubfox.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
Một số điều này là chính xác, nhưng người dùng luôn đọc sách ~/.bashrclà một lời khuyên tồi: bạn chỉ.bashrc nên đọc từ một vỏ tương tác . Bạn đã bỏ lỡ vấn đề cốt lõi ở đây là khi đăng nhập dưới X, không có trường hợp đăng nhập của bash (trong hầu hết các kết hợp môi trường của trình quản lý màn hình / máy tính để bàn, bao gồm cả rõ ràng là của AntonioK).
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn phản hôi của bạn. Tôi hy vọng tôi đã cập nhật câu trả lời của mình đủ tốt để giải quyết khiếu nại của bạn. Về lời khuyên của tôi về "luôn luôn đọc .bashrc", tôi có nghĩa là luôn luôn cho một vỏ tương tác. Tôi đã làm rõ phần đó. Tôi hy vọng nó không gây hiểu lầm nữa.
lesmana

2
" Ubuntu đặc biệt không khuyến khích sử dụng .profile( liên kết ) " wiki đã làm một lần (vô lý) không khuyến khích điều đó; Điều đó đã được sửa. (Lưu ý /etc/profilekhông được khuyến khích cho các bài tập trên toàn hệ thống, ưu tiên thêm tập lệnh vào /etc/profile.d.) Các .profiletệp theo người dùng hiện được trình bày như một trong những cách được đề xuất để đặt biến môi trường cho mỗi người dùng: "Các tệp phù hợp cho cài đặt biến môi trường chỉ ảnh hưởng đến người dùng cụ thể (chứ không phải toàn bộ hệ thống) là ~ / .pam_en môi trường~ / .profile . "
Eliah Kagan

Trang được liên kết về Debian chỉ định rằng Debian không đọc ~/.profileđể đăng nhập đồ họa và ~/.xsessionrcnên được sử dụng thay thế.
karora

cảm ơn vì đã chú ý trang wiki đã được cập nhật. tôi liên kết với các phiên bản khi chúng ở thời điểm trả lời.
lesmana

2

Một số vấn đề phát sinh khi cố gắng tải lại tập tin / nguồn ~ / .profile. [Điều này đề cập đến Ubuntu linux - trong một số trường hợp, chi tiết của các lệnh sẽ khác nhau]

  1. Bạn đang chạy trực tiếp trong thiết bị đầu cuối hoặc trong một kịch bản?
  2. Làm thế nào để bạn chạy này trong một kịch bản?

Quảng cáo. 1)

Chạy cái này trực tiếp trong terminal có nghĩa là sẽ không có subshell nào được tạo. Vì vậy, bạn có thể sử dụng một trong hai lệnh:

source ~/.bash_profile

hoặc là

. ~/.bash_profile

Trong cả hai trường hợp, điều này sẽ cập nhật môi trường với nội dung của tệp .profile.

Quảng cáo 2) Bạn có thể bắt đầu bất kỳ tập lệnh bash nào bằng cách gọi

sh myscript.sh 

hoặc là

. myscript.sh

Trong trường hợp đầu tiên, điều này sẽ tạo ra một lớp con sẽ không ảnh hưởng đến các biến môi trường của hệ thống của bạn và chúng sẽ chỉ hiển thị với quy trình của lớp con. Sau khi hoàn thành lệnh subshell, không xuất khẩu, vv sẽ được áp dụng. ĐÂY LÀ MỘT CÂU HỎI THƯỜNG GẶP VÀ GÂY RA NHIỀU NHÀ PHÁT TRIỂN ĐỂ KIẾM ĐƯỢC RẤT NHIỀU THỜI GIAN.

Để các thay đổi của bạn được áp dụng trong tập lệnh của bạn có hiệu lực đối với môi trường toàn cầu, tập lệnh phải được chạy với

.myscript.sh

chỉ huy.

Để đảm bảo rằng tập lệnh của bạn không bị chạy trong một khung con, bạn có thể sử dụng chức năng này. (Một ví dụ nữa là dành cho Ubuntu shell)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Tôi hy vọng điều này sẽ xóa một số hiểu lầm phổ biến! : D Chúc may mắn!


1

Trong câu hỏi của bạn, bạn tham khảo https://stackoverflow.com/questions/902946/ vì khuyến cáo không nên nguồn, khi câu trả lời được chấp nhận quy định

  • Đặt thiết lập PATH của tôi vào tệp .profile (vì đôi khi tôi sử dụng các shell khác)
  • Đặt các bí danh và hàm Bash của tôi vào tệp .bashrc của tôi
  • Sau đó sử dụng [EDITED: snip code-bình luận]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Đưa tất cả vào .profilekhông hoạt động với tôi trên Linux Mint. Sử dụng .bashrclàm việc tốt.


0

Giải pháp đơn giản là làm cho thiết bị đầu cuối trở thành thiết bị đầu cuối đăng nhập. Đối với thiết bị đầu cuối Gnome trong 'Ngói và Lệnh' của cấu hình mặc định, bạn có thể chọn hộp "Chạy lệnh dưới dạng vỏ đăng nhập". Bài viết này giải thích sự khác biệt giữa vỏ đăng nhập và vỏ không đăng nhập.

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.