web-dev-qa-db-ja.com

.profileと.bashrcがMacで機能しない

この問題は私が長い間抱えています。端末.profileを実行した後、.bashrcファイルが機能しない(実行されない)。問題の原因をどこから探したらよいか教えてもらえますか?

29
michaltaberski

このQ&Aはスーパーユーザーに行くべきだと思いますが、とにかく:

man page のINVOCATIONセクションによれば、

  • /etc/profileおよび~/.profileは、インタラクティブログインシェル用に読み取られます。
  • ~/.bashrcは、インタラクティブな非ログインシェル用に読み取られます。

他のUNIXマシンが対話型ログインシェルであっても自動的に~/.bashrcを読み取る場合は、システム全体の/etc/ profile~/.bashrcを読み取る行があるためです。 OS Xのシステム全体/etc/profileにはありません。

したがって、対話型ログインシェルでも~/.bashrcを実行する場合は、次の行を含める必要があります

. ~/.bashrc

~/.profileで。

17
Yuji

「手で」それらを調達してみてください:

source ~/.profile

何が起こるか見てください。他の人が指摘したように、.profileはログインシェルによって供給され、.bashrcは非ログインシェルによって供給されることに注意してください。そのため、両方ではなく、どちらか一方を試してください。

3
Gordon Davisson

上記の良い情報ですが、私が抱えていた問題と見つけた解決策の詳細を共有したいと思いました。

必要性:OSX 10.8(ML)のPATHにディレクトリを追加します。

問題:多くの場合、ガイダンスは「ホームディレクトリの.profileを変更する」ことです。デフォルトでは、このファイルはOSXに存在しないため、少し混乱します。新しいディレクトリを既存のPATHに追加するエクスポートステートメントを追加すると、機能しなくなるため、混乱を招きます。上記でカバー。

解決策:exportステートメントを.bash_profile(ホームディレクトリにもある)に追加しました。

この猫の皮をむく方法はたくさんあると思います。これは私のために働いた。ある程度の自信を呼び起こす:.bash_profileはすでに存在しており、他のインストール済みソフトウェア(Rubyなど)がそれを変更したことがわかりました。より良い解決策があれば、それについて聞いて喜んでいます!

2
tjim

端末の設定で、[スタートアップ]ペインを確認します。次のオプションがあります。

シェルは次のように開きます:

  • デフォルトのログインシェル(/ usr/bin/login)
  • コマンド(完全パス)

「デフォルト」を選択しました...カスタムコマンドを選択している場合は、それが要因である可能性があります。

次に確認するポイントは、シェルがログインシェルとして起動されているかどうかです。 psリストを実行すると、次のように表示されます。

_  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
_

ここで重要なのは、シェル名の前にある「_-_」です。これは、シェルにプロファイルと関連するものを実行するように指示します。現在のウィンドウにそれが表示されない場合は、実行するまで設定を調整する必要がある場合があります。

端末設定の設定ペインにも、シェルオプションが一覧表示されます。私は/ bin/shを記載しています。


これは必要ないはずです

最悪の事態が発生した場合でも、過去に他の非協力的なシステムで行ったように、Windowsから実行できるプログラム 'loginsh'を作成し、選択したシェルを '_-_ 'プレフィックスは、ログインシェルとして機能するように指示します。

_#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"_ヘッダーと '_err_*_'ルーチンはどこでも使用するエラー報告パッケージです。jlss_basename()関数は基本的に、POSIXにあるようなシステム提供のバージョンと同じです- _<libgen.h>_ 。)

2