4

ソースからbash 4.2をインストールしようとしました(自作ではありません)。それは一種の実行、一種の失敗です。これをデフォルトのログイン シェルにすると、多くのコマンドを実行できますが、多くの場合、cd /System などの基本的なコマンドでシェルが強制終了されます。

更新されたマスター tarball をダウンロードし、基本的にこれと同等のものをインストールしました。

./configure && make && sudo make install
sudo ln -s /usr/local/bin/bash /bin/bash4
sudo bash -c "echo /bin/bash4 >> /private/etc/shells"
chsh -s /usr/local/bin/bash # A

...そして、System Prefs -> Users and Groups -> (me) -> Advanced Options に移動し、デフォルトのシェルを /bin/bash4 に変更しました。

Homebrew は readline をインストールしてそれを要求するようで、 -DSSH_SOURCE_BASHRC の追加フラグを環境に追加します (これは私がやっていることには問題にはなりません)

4

2 に答える 2

2

t_string が $HOME で始まらない場合、問題はこの行にあるようです。(parse.y:5278)

  strcpy (t_string, polite_directory_format (t_string));

迅速で汚い修正:

diff --git i/general.c w/general.c
index 491a7ea267ab..ec9b6271015d 100644
--- i/general.c
+++ w/general.c
@@ -700,10 +700,11 @@ polite_directory_format (name)
       strncpy (tdir + 1, name + l, sizeof(tdir) - 2);
       tdir[0] = '~';
       tdir[sizeof(tdir) - 1] = '\0';
-      return (tdir);
     }
   else
-    return (name);
+    strcpy (tdir, name);
+
+  return (tdir);
 }

 /* Trim NAME.  If NAME begins with `~/', skip over tilde prefix.  Trim to

要するに、gcc でコンパイルして実行するが、clang/llvm で失敗する次のテスト ケースです。

#include <stdio.h>
#include <string.h>

char *foo(char *buf) {
  return(buf);
}

int main(int argc, char *argv[]) {
  char buf[1024];

  strcpy(buf, "buffer");

  strcpy(buf, foo(buf));
  printf("%s\n", buf);
}

.

> gcc -o test test.c
> ./test
buffer
> cc -o test test.c
> ./test
Abort trap: 6
于 2013-11-03T00:32:09.430 に答える