.profile và .bashrc không hoạt động trên máy Mac của tôi


29

Vấn đề này tôi có một thời gian dài. Sau khi chạy terminal .profile và tệp .bashrc không hoạt động (không được thực thi). Bạn có thể chỉ ra nơi tôi nên tìm kiếm một nguồn gốc của vấn đề?


kiểm tra xem các tệp này có quyền thích hợp hay không

vâng ... bạn đúng là lý do thực sự ngu ngốc - quyền không chính xác chmod + x ~ / .profile và mọi thứ đều hoạt động tốt.

5
@xTrol: Điều đó không có ý nghĩa, ~/.profilekhông yêu cầu sự cho phép thực thi. (Shell nguồn nó, nó không thực hiện nó). Hãy thử chmod -x ~/.profilevà xem nếu nó vẫn hoạt động.
Keith Thompson

Câu trả lời:


40

Tôi đã có một vấn đề tương tự với việc tôi .profilekhông được chạy. Hóa ra (như được giải thích trong câu trả lời Apple StackExchange này ) rằng nếu bạn có .bash_profilehoặc .bash_logincác tệp, thì bạn .profilesẽ bị bỏ qua bởi bash.


2
Vấn đề của tôi là tôi đã cài đặt Python tự động tạo tệp .bash_profile khiến .profile của tôi không chạy được.

5
Câu trả lời này giúp tôi. .bash_loginđã được thêm vào sau khi tôi cài đặt rvm.

17

Tôi đoán Q & A này nên đến Superuser, nhưng dù sao đi nữa:

Theo phần HÓA ĐƠN của trang người đàn ông ,

  • /etc/profile~/.profileđược đọc cho một vỏ đăng nhập tương tác, và
  • ~/.bashrc được đọc cho một vỏ không đăng nhập tương tác.

Nếu máy UNIX khác của bạn tự động đọc ~/.bashrcngay cả đối với vỏ đăng nhập tương tác, thì đó là vì toàn hệ thống /etc/ profilecó một dòng đọc ~/.bashrc. Toàn hệ thống của OS X /etc/profilekhông có.

Vì vậy, nếu bạn muốn chạy ~/.bashrcngay cả đối với vỏ đăng nhập tương tác, bạn cần bao gồm một dòng

. ~/.bashrc

trong của bạn ~/.profile.


Và để điền vào phần còn thiếu ở đây: Vỏ Terminal (mà câu hỏi của OP đã nói về) theo mặc định là vỏ đăng nhập tương tác.
LarsH

3

Hãy thử tìm nguồn cung ứng chúng "bằng tay":

source ~/.profile

và hãy xem chuyện gì xảy ra. Lưu ý rằng, như những người khác đã chỉ ra, .profile có nguồn gốc từ các shell đăng nhập, .bashrc bởi các shell không đăng nhập; vì vậy hãy thử cái này hay cái kia, không phải cả hai.


2

Trong tùy chọn thiết bị đầu cuối của bạn, hãy kiểm tra trong ngăn 'Khởi động'. Bạn có các tùy chọn:

Vỏ mở với:

  • Shell đăng nhập mặc định (/ usr / bin / đăng nhập)
  • Lệnh (đường dẫn hoàn chỉnh)

Tôi đã chọn 'mặc định' ... nếu bạn có lệnh tùy chỉnh được chọn, đó có thể là một yếu tố.

Điểm tiếp theo để kiểm tra là liệu shell có được khởi động như một shell đăng nhập hay không. Khi tôi làm một psdanh sách, tôi thấy:

  PID TTY           TIME CMD
24088 ttys000    0:00.03 -sh
24614 ttys001    0:00.03 -sh
25127 ttys002    0:00.05 -sh
35544 ttys003    0:00.08 -sh
40926 ttys004    0:00.03 -sh

Điểm mấu chốt ở đây là ' -' phía trước tên shell; Nó báo cho shell chạy qua hồ sơ và những thứ liên quan. Nếu bạn không thấy điều đó trong các cửa sổ hiện tại của mình, bạn có thể cần phải xử lý các cài đặt cho đến khi bạn thực hiện.

Cửa sổ cài đặt trong tùy chọn thiết bị đầu cuối cũng liệt kê một tùy chọn shell. Tôi có / bin / sh được liệt kê trong tôi.


Bạn không cần điều này

Nếu điều tồi tệ nhất đến tồi tệ nhất, bạn có thể làm như tôi đã làm trên một số hệ thống không hợp tác khác trong thời gian qua - tôi đã tạo một chương trình 'loginsh' mà tôi có thể chạy từ các cửa sổ, và đến lượt nó sẽ thực thi lớp vỏ được chọn của tôi với ' -' tiền tố để bảo nó hoạt động như một vỏ đăng nhập.

#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "stderr.h"
#include "jlss.h"

#ifndef DEFAULT_SHELL
#define DEFAULT_SHELL   "/bin/sh"
#endif /* DEFAULT_SHELL */

#ifndef MAX_SHELLBASENAME
#define MAX_SHELLBASENAME   256
#endif /* MAX_SHELLBASENAME */

#ifndef lint
static const char sccs[] = "@(#)$Id: loginsh.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
#endif

int main(int argc, char **argv)
{
    char     *shell;
    char      shellname[MAX_SHELLBASENAME];

    err_setarg0(argv[0]);

    /* Which shell to use? */
    if ((shell = getenv("SHELL")) == (char *)0)
        shell = DEFAULT_SHELL;

    /* Set up argv[0] in new argument list; reuse old argv space */
    shellname[0] = '-';
    strcpy(&shellname[1], jlss_basename(shell));
    argv[0] = shellname;

    /* Execv must work -- the shell must be an executable program */
    execv(shell, &argv[0]);
    err_syserr("cannot execute shell %s\n", shell);

    /* NOTREACHED */
    return(EXIT_FAILURE);
}

(Các thói quen của "stderr.h"tiêu đề và ' err_*' là gói báo cáo lỗi tôi sử dụng ở mọi nơi. jlss_basename()Chức năng về cơ bản giống như các phiên bản do hệ thống cung cấp như được tìm thấy trong POSIX <libgen.h>.)


2

Thông tin tốt ở trên, nhưng tôi nghĩ tôi sẽ chia sẻ một số chi tiết cụ thể về vấn đề tôi gặp phải và giải pháp tôi tìm thấy.

Sự cần thiết: Thêm một thư mục vào PATH trên OSX 10.8 (ML).

Vấn đề: Hướng dẫn thường là "sửa đổi .profile trong thư mục chính của bạn". Một chút khó hiểu vì theo mặc định, tệp này không tồn tại trên OSX. Chắc chắn là khó hiểu bởi vì một khi bạn thêm một câu lệnh xuất để nối thêm thư mục mới vào PATH hiện tại ... thì nó không hoạt động. Bao phủ ở trên.

Giải pháp: Tôi đã thêm câu lệnh xuất vào .bash_profile của tôi (cũng trong thư mục chính).

Tôi chắc chắn có nhiều cách để nuôi con mèo này. Cái này làm việc cho tôi Một chút tự tin truyền cảm hứng: .bash_profile đã tồn tại và tôi có thể thấy rằng phần mềm được cài đặt khác (ví dụ: Ruby) đã sửa đổi nó. Nếu có một giải pháp tốt hơn tôi sẽ rất vui khi nghe về nó!

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.