.profile dan .bashrc tidak berfungsi di Mac saya

29

Masalah ini sudah lama saya alami. Setelah menjalankan terminal .profile, dan file .bashrc tidak berfungsi (tidak dijalankan). Bisakah Anda menunjukkan di mana saya harus mencari sumber masalah?


sumber
periksa apakah file ini memiliki izin yang tepat
ya ... Anda benar alasannya benar-benar bodoh - izin salah chmod + x ~ / .profile dan semuanya bekerja dengan baik.
5
@ xTrol: Itu tidak masuk akal, ~/.profiletidak memerlukan izin eksekusi. (Shell sumbernya, itu tidak menjalankannya). Coba chmod -x ~/.profiledan lihat apakah masih berfungsi.
Keith Thompson

Jawaban:

40

Saya memiliki masalah yang sama dengan saya .profiletidak dijalankan. Ternyata (seperti yang dijelaskan dalam jawaban Apple StackExchange ) bahwa jika Anda memiliki .bash_profileatau .bash_loginfile, maka Anda .profileakan diabaikan oleh bash.

Pidge
sumber
2
Masalah saya adalah saya menginstal Python yang secara otomatis membuat file .bash_profile yang menyebabkan .profile saya tidak berjalan.
5
Jawaban ini membantu saya. .bash_loginditambahkan setelah saya menginstal rvm.
17

Saya kira T&J ini harus pergi ke Superuser, tetapi bagaimanapun:

Menurut bagian INVOCASI dari halaman manual ,

  • /etc/profiledan ~/.profiledibaca untuk shell login interaktif, dan
  • ~/.bashrc dibaca untuk shell non-login interaktif.

Jika mesin UNIX Anda yang lain secara otomatis membaca ~/.bashrcbahkan untuk shell login interaktif, itu karena seluruh sistem /etc/ profilememiliki garis yang berbunyi ~/.bashrc. Sistem OS X /etc/profiletidak memiliki satu.

Jadi, jika Anda ingin menjalankan ~/.bashrcbahkan untuk shell login interaktif, Anda harus memasukkan satu baris

. ~/.bashrc

di Anda ~/.profile.

Yuji
sumber
Dan untuk mengisi bagian yang hilang di sini: Shell terminal (yang menjadi pertanyaan OP) adalah default shell login interaktif.
LarsH
3

Coba sumber mereka "dengan tangan":

source ~/.profile

dan lihat apa yang terjadi. Perhatikan bahwa, seperti yang orang lain tunjukkan,. Profil diambil dari shell login, .bashrc oleh shell non-login; jadi cobalah satu atau yang lain, tidak keduanya.

Gordon Davisson
sumber
2

Di preferensi terminal Anda, periksa di panel 'Startup'. Anda memiliki opsi:

Kerang terbuka dengan:

  • Shell login default (/ usr / bin / login)
  • Command (path lengkap)

Saya telah memilih 'standar' ... jika Anda memiliki perintah khusus yang dipilih, itu mungkin merupakan faktor.

Titik selanjutnya untuk memeriksa adalah apakah shell dimulai sebagai shell login. Ketika saya melakukan psdaftar, saya melihat:

  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

Poin kuncinya di sini adalah ' -' di depan nama shell; yang memberitahu shell untuk menjalankan melalui profil dan hal-hal terkait. Jika Anda tidak melihat itu di windows Anda saat ini, Anda mungkin perlu menipu dengan pengaturan sampai Anda melakukannya.

Panel pengaturan di preferensi terminal juga mencantumkan opsi shell. Saya memiliki / bin / sh terdaftar di tambang.


Anda seharusnya tidak membutuhkan ini

Jika yang terburuk menjadi yang terburuk, Anda dapat melakukan seperti yang saya lakukan pada beberapa sistem tidak kooperatif di masa lalu - saya membuat program 'loginsh' yang dapat saya jalankan dari windows, dan pada gilirannya akan menjalankan shell yang saya pilih dengan ' -' awalan untuk memerintahkannya berfungsi sebagai shell login.

#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);
}

( "stderr.h"Header dan ' err_*' rutin adalah paket pelaporan kesalahan yang saya gunakan di mana-mana. jlss_basename()Fungsinya pada dasarnya sama dengan versi yang disediakan sistem seperti ditemukan di POSIX <libgen.h>.)

Jonathan Leffler
sumber
2

Informasi bagus di atas, tetapi saya pikir saya akan membagikan beberapa spesifik tentang masalah yang saya miliki dan solusi yang saya temukan.

Kebutuhan: Tambahkan direktori ke PATH pada OSX 10.8 (ML).

Masalahnya: Bimbingan sering kali "mod the .profile di direktori home Anda". Agak membingungkan karena, secara default, file ini tidak ada di OSX. Ragu membingungkan karena begitu Anda menambahkan pernyataan ekspor untuk menambahkan direktori baru ke PATH yang ada ... itu tidak berfungsi. Tercakup di atas.

Solusinya: Saya menambahkan pernyataan ekspor ke .bash_profile saya (juga di direktori home).

Saya yakin ada banyak cara untuk menguliti kucing ini. Yang ini berhasil untuk saya. Agak menginspirasi kepercayaan: .bash_profile sudah ada dan saya bisa melihat bahwa perangkat lunak lain yang diinstal (misalnya Ruby) telah memodifikasinya. Jika ada solusi yang lebih baik, saya akan senang mendengarnya!

tjim
sumber