Tại sao không có shebang trong .bashrc / .bash_profile?


22

Yêu cầu đơn giản: Tôi vừa nhận ra rằng tôi chưa bao giờ thấy một shebang trên đầu .bashrctập lệnh, điều này khiến tôi nghĩ rằng hệ thống sử dụng shell mặc định để lấy nó khi đăng nhập ( ${SHELL}). Tôi đang suy nghĩ về lý do tại sao lại như vậy, nghĩa là nó được coi là một thói quen xấu khi sử dụng một cái gì đó không phải là vỏ mặc định để chạy tập lệnh đăng nhập.


1
Có một lý do tại sao nó được gọi là bash rc ...
Ajedi32

Câu trả lời:


28

.bashrcKHÔNG phải.bash_profile là kịch bản. Tệp cấu hình của chúng được lấy nguồn mỗi lần được thực thi theo một trong hai cách:bash

  • tương tác
  • đăng nhập

Phần HÓA ĐƠN của trang bash man có liên quan gì.

Một shell đăng nhập là một cái mà ký tự đầu tiên của đối số 0 là một -hoặc một bắt đầu với --logintùy chọn.

Một shell tương tác được bắt đầu mà không có đối số không phải tùy chọn và không có -ctùy chọn có đầu vào và lỗi tiêu chuẩn được kết nối với các thiết bị đầu cuối (như được xác định bởi isatty(3)), hoặc bắt đầu với -i tùy chọn. PS1 được đặt và $-bao gồm inếu bashlà tương tác, cho phép tập lệnh shell hoặc một tập tin khởi động để kiểm tra trạng thái này.

Các đoạn sau đây mô tả cách bashthực hiện các tệp khởi động của nó. Nếu bất kỳ tệp nào tồn tại nhưng không thể đọc được, bash báo lỗi. Dấu ngã được mở rộng bằng tên tệp như được mô tả bên dưới trong Mở rộng Tilde trong phần MỞ RỘNG .

Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với --logintùy chọn, đầu tiên nó sẽ đọc và thực thi các lệnh từ tệp /etc/profile, nếu tệp đó tồn tại. Sau khi đọc tệp đó, nó tìm kiếm ~/.bash_profile, ~/.bash_login~/.profile, theo thứ tự đó, và đọc và thực thi các lệnh từ cái đầu tiên tồn tại và có thể đọc được. Các --noprofiletùy chọn có thể được sử dụng khi vỏ được bắt đầu để ức chế hành vi này.

Khi shell đăng nhập thoát, bash đọc và thực thi các lệnh từ tệp ~/.bash_logout, nếu nó tồn tại.

Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, bash sẽ đọc và thực thi các lệnh từ đó ~/.bashrc, nếu tệp đó tồn tại. Điều này có thể bị ức chế bằng cách sử dụng --norctùy chọn. Các --rcfile file tùy chọn sẽ buộc bash để đọc và thực hiện các lệnh từ tập tin thay vì ~/.bashrc.

Bạn có thể kiểm soát khi chúng được tải thông qua các công tắc dòng lệnh --norc--noprofile. Bạn cũng có thể ghi đè vị trí nơi chúng được tải từ sử dụng công --rcfiletắc.

Như những người khác đã đề cập, bạn có thể bắt chước cách các tệp này được tải thông qua việc sử dụng source <file>lệnh hoặc sử dụng . <file>lệnh.

Tốt nhất nên nghĩ về chức năng này như sau:

  1. Bash bắt đầu với một môi trường trần
  2. bash sau đó mở một trong những tệp này (tùy thuộc vào cách nó được gọi là tương tác hoặc đăng nhập, và sau đó ...
  3. ... Từng dòng thực thi từng lệnh trong tệp ...
  4. khi hoàn thành cung cấp quyền điều khiển ở dạng dấu nhắc, chờ nhập

Phương thức gọi

Chủ đề này dường như thỉnh thoảng xuất hiện, vì vậy đây là một ít các cách khác nhau để gọi bashvà kết quả của chúng. LƯU Ý: Để giúp tôi thêm các thông báo "có nguồn gốc $ HOME / .bashrc" và "có nguồn gốc $ HOME / .bash_profile "cho các tệp tương ứng của họ.

cuộc gọi cơ bản

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -or-bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    LƯU Ý: Lưu ý rằng công -ctắc không có nguồn nào cả!

vô hiệu hóa tập tin cấu hình khỏi bị đọc

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -or- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Nhiều cách bí truyền hơn để gọi bash

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Những thất bại

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Có thể có nhiều hơn nhưng bạn có được điểm, hy vọng ....

Còn gì nữa không

Cuối cùng, nếu bạn quá say mê với chủ đề này mà bạn muốn đọc / khám phá thêm về nó, tôi khuyên bạn nên xem Hướng dẫn cho người mới bắt đầu Bash, cụ thể là phần: 1.2. Ưu điểm của Bourne Again SHell . Các phần phụ khác nhau theo đó, "1.2.2.1. Gọi" đến "1.2.2.3.3. Hành vi vỏ tương tác" giải thích sự khác biệt ở mức độ thấp giữa các cách khác nhau mà bạn có thể gọi bash.


@amphibient - xin lỗi nó đã ra tay một chút, hy vọng mọi người sẽ đánh giá cao giá trị của nó và không trừng phạt nó với downvote. Với điều này ở đây bây giờ chúng ta có thể tham khảo nó trong câu trả lời khác xuống đường. số 8-). Tôi đang suy nghĩ làm một cái bàn để thể hiện điều này nhưng điều đó thật điên rồ 8-).
slm

Đã thực sự thử nghiệm những? Tôi đã từng cố gắng làm theo những gì bash của tôi làm trong vắt và nó không hoàn toàn hoạt động như hướng dẫn được đề xuất
Bananguin

@Bananguin - mỗi một trong số các lệnh đó đều do tôi điều hành và đó là đầu ra được tạo ra bên dưới các lệnh. "Điều" tiềm năng duy nhất với thiết lập của tôi có thể là tôi .bash_profilebao gồm một dòng để tìm nguồn .bashrc. Nhưng tôi tin rằng đó là rất điển hình của các thiết lập.
slm

Điều này có thể chủ quan nhưng tôi sẽ không nói điều đó .bashrc.bash_profilekhông phải là kịch bản . IMHO chúng là các tập lệnh mục đích cụ thể được ngầm định trong quá trình khởi tạo bash hoặc rõ ràng khi bạn cần áp dụng các sửa đổi của chúng. Họ không chỉ cấu hình môi trường bash (biến, hàm, bí danh ...) như mong đợi từ các tệp cấu hình. Họ có thể làm bất kỳ hành động như trong các kịch bản phổ biến. Ví dụ, họ có thể bắt đầu các hành động khác nhau như tác vụ nền, viết bản ghi nhật ký, khởi tạo một số chương trình, v.v ... Dù sao cũng cảm ơn bạn đã tóm tắt chi tiết!
pabouk

Câu trả lời này thậm chí còn tốt hơn bất kỳ câu trả lời nào ở đây stackoverflow.com/questions/415403/ trên !
Jacob Tomlinson

13

.bashrccác kịch bản chỉ được điều hành bởi bashchính nó. Chúng không đứng tự do và chúng không được exechệ thống sử dụng. (Trên thực tế, chúng thường không được đánh dấu là có thể thực thi được và như bạn nói, chúng không có dòng shebang.)

Các tập lệnh như vậy được dự định là sourced, vì chúng thường làm những việc như thay đổi các biến môi trường ( $PATHví dụ), được dự kiến ​​sẽ tồn tại sau khi tập lệnh kết thúc. Vì vậy, nó sẽ thực sự là vô nghĩa khi cố gắng thực hiện một trong một subshell.


5

Ngoài các câu trả lời khác, lưu ý rằng nếu bạn muốn, không có gì cấm bạn đặt shebang ở đầu các tệp cấu hình này.

Điều đó sẽ không ảnh hưởng đến việc tìm nguồn cung ứng cho họ vì shebang sẽ được xử lý giống như một nhận xét thông thường, tức là bị bỏ qua.

Điều đó có thể giúp các biên tập viên sử dụng tô sáng cú pháp để tìm ra ngôn ngữ lập trình nào được sử dụng trong tệp.

Lưu ý rằng một số trình soạn thảo như vimcung cấp các cách khác như modelines cho cái sau. tức là bạn luôn có thể đặt các dòng chế độ ở cuối ~/.bashrc~/.bash_profilenhư vậy:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
Câu trả lời được chấp nhận từ @slm ở trên là tuyệt vời, nhưng đây là những gì tôi đang tìm kiếm, liên quan đến việc thêm một shebang vào đầu của tôi .bash_profiletheo khuyến nghị từ ShellCheck.
jlucktay

1

Tôi đọc nó ở bất cứ đâu không biết chính xác ở đâu nhưng đó là sự thật

Hướng dẫn Bash hơi khó hiểu trong lĩnh vực này, nhưng Bash không eXecute ~ / .bash_profile giống như một tập lệnh shell. Nó đọc tệp và sau đó thực thi các lệnh bên trong nó (Bạn có thể làm điều gì đó tương tự bằng cách chạy nguồn ~ / .bash_profile).

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.