在 OS X 中意外复制了 /bin/bash 上的文件

在 OS X 中意外复制了 /bin/bash 上的文件

我错误地复制了两个文件/bin/bash。现在我的终端无响应。我已关注教程,但没有帮助。

作为参考,这些文件是runcocoa.shrunc.sh具体来说,来自这个教程)。我也将它们复制到了/usr/local/bin,但后来我删除了它们……

我怎样才能恢复系统的功能?

答案1

我去了终端 » 偏好设置 » 启动并改变了贝壳打开默认登录 shell命令,并使用另一个shell(例如,/bin/csh而不是我原来的/bin/bash)。

这使我的终端再次正常运行 - 并且使用教程中,我安装了较新版本的 Bash 来替换/bin/bash我最初覆盖的版本。

我剪切并粘贴了以下几行:

curl -LO ftp://ftp.cwru.edu/pub/bash/bash-4.2.tar.gz
tar zxvf bash-4.2.tar.gz
cd bash-4.2
./configure && make && sudo make install
chsh -s /usr/local/bin/bash {user_name}
sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"
cd /bin
sudo mv bash bash-old
sudo ln -s /usr/local/bin/bash bash

并做了!

答案2

正如另一个答案中提到的,您可以通过将 shell 打开的命令更改为 /bin/sh 之类的命令来使用终端:

/bin/sh 和 /bin/bash 二进制文件几乎相同,因此您只需将 /bin/sh 复制到 /bin/bash 上即可。

$ diff -y --suppress-common-lines -W 80 <(strings /bin/bash) <(strings /bin/sh)
                                      > /bin/bash
${FCEDIT:-${EDITOR:-ed}}              | ${FCEDIT:-ed}
@(#)PROGRAM:bash  PROJECT:bash-86.1   | @(#)PROGRAM:sh  PROJECT:bash-86.1

/bin/sh 和 /bin/bash 之间的大部分差异取决于调用 shell 的名称。在其他平台上,/bin/sh 是指向 /bin/bash 的符号链接。请参阅这个问题

恢复分区还包含一个 bash 二进制文件。由于不支持 i386,所以它比较小,但它与lipo -thin x86_64 /bin/bash -output /tmp/bash我在安装时创建的二进制文件相同。

$ diskutil mount 'Recovery HD'
$ hdiutil mount /Volumes/Recovery\ HD/com.apple.recovery.boot/BaseSystem.dmg
$ stat -f %z /bin/bash /Volumes/OS\ X\ 10.8.2\ Base\ System/bin/bash
1333920
699040
$ file /bin/bash
/bin/bash: Mach-O universal binary with 2 architectures
/bin/bash (for architecture i386):  Mach-O executable i386
/bin/bash (for architecture x86_64):    Mach-O 64-bit executable x86_64
$ file /Volumes/OS\ X\ 10.8.2\ Base\ System/bin/bash
/Volumes/OS X 10.8.2 Base System/bin/bash: Mach-O 64-bit executable x86_64
$ lipo -thin x86_64 /bin/bash -output /tmp/bash
$ stat -f %z /tmp/bash
699040
$ diff /tmp/bash /Volumes/OS\ X\ 10.8.2\ Base\ System/bin/bash
$ 

相关内容