如何在 OS X 上仅使用 GNU 实用程序设置单独的 bash 环境?

如何在 OS X 上仅使用 GNU 实用程序设置单独的 bash 环境?

在过去的 5 年里,我一直使用 Linux 作为我执行科学计算的日常操作系统。我的工作最近给了我一台 Mac,我将成为接下来几个月的主要用户。我一直遇到 Mac 上的 Free-BSD bash 环境和我习惯的 GNU 环境之间的冲突,无论是使用我设置的 bash 脚本还是当我尝试运行 bash 命令(coreutilsfindutils等)时。我不想完全切换到 Free-BSD 实用程序,因为我的所有其他计算机以及我们的 HPC 都使用带有 GNU 实用程序的 Linux。我希望避免维护两组 bash 脚本,并且还必须记住两个系统之间不同标志和功能的细微差别。我也不想破坏其他用户将使用的任何 Mac 图形用户界面实用程序等(无论是在接下来的几个月内还是在将其提供给其他人时)。此外,回应相关问题警告不要用 GNU 实用程序完全替换 Mac Free-BSD 实用程序。

是否可以安装/设置一个单独的 bash 环境以仅使用 GNU 实用程序,同时保留系统 Free-BSD 实用程序? 我期望最有希望的选项是将我的变量设置$PATH为指向包含 GNU 可执行文件(及其标准名称)的目录,同时忽略 Free-BSD 可执行文件。我如何将其应用于我的跨平台 bash 脚本?是否有其他值得考虑的选项?

答案1

首先,这不仅仅是coreutils。 BSD 相当于GNUfindutils也是很不一样,几乎每个命令都与动态联动是不同的等等。

除此之外,您还必须处理版本差异:OS X 仍然附带许多旧软件以保留 GPL2 而不是 GPL3,例如 Bash 3.x 而不是 Bash 4.x。这自动工具对于前沿的 Linux 发行版来说,它们也常常已经过时。

你问题核心部分的答案是:“当然,为什么不呢?”您可以使用自制要安装所有这些替代 GNU 工具,然后将$(brew --prefix coreutils)/libexec/gnubin/usr/local/bin首先放入您的文件中,PATH以确保首先找到它们:

export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"

如果由于某种原因brew将包安装到另一个位置,也请将其包含在PATH变量中。

如果您只想替换几个包,那么棘手的部分是处理所有名称更改。每当brew安装一个已经在核心操作系统中实现的程序时,例如安装 GNU 时coreutils,它会以不同的方式命名其版本,以便您可以根据您当时的需要运行其中一个。我建议您使用间接层来修复所有这些问题,而不是重命名所有这些符号链接1:

$ mkdir ~/linux
$ cd ~/linux
$ ln -s /usr/local/bin/gmv mv
...etc for all the other tools you want to rename to cover OS versions
$ export PATH=$HOME/linux:$PATH
...try it out...

一旦您对新环境感到满意,您就可以export PATH=$HOME/linux:$PATH~/.bash_profile.

这可以处理交互式使用,无论是批量替换还是单个应用程序替换。

不幸的是,它并没有完全解决 shell 脚本问题,因为有时 shell 脚本会获得自己的环境,例如从cron.在这种情况下,您可以修改PATH每个跨平台 shell 脚本顶部的:

#!/bin/bash
export PATH="$HOME/linux:$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"

您不需要将其设置为条件,因为它只是为 shell 提供另一个查找程序的地方。


脚注

  1. 例如/usr/local/bin/gmv../Cellar/coreutils/$version/bin/gmv

相关文章

  1. 如何用 GNU 核心实用程序替换 Mac OS X 实用程序?
  2. 在 Mac OS X 上安装和使用 GNU 命令行工具

答案2

如果不使用 VM box 或双重启动,运行 GNU 不可能与 freebsd 一起本地运行,则将此答案放在这里作为您会尝试的方法。

如前所述,自制程序无法安装所有 GNU coreutils,如果我错了,请纠正我,但您也希望能够将所有文件放在一个地方(一台机器)

如果你有一台连接到互联网的辅助计算机(也许是树莓派?),你可以从你的 mac 上通过 SSH 进入 Linux 机器,或者如果你想使用 X 环境,你可以使用 x11vnc 在你的计算机上使用 Linux 计算机。苹果。

请记住,如果您使用 SSH,则只能访问登录 shell。

如何创建 SSH 服务器和客户端

首先检查 openssh 服务器是否正在您的 Linux 机器上运行

$ service ssh status

当服务正在运行时,您将得到如下输出。

    ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2015-07-17 16:51:08 NPT; 5h 21min ago
  Process: 1669 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 615 (sshd)
   CGroup: /system.slice/ssh.service
           └─615 /usr/sbin/sshd -D

如果服务没有运行,首先检查是否安装了openssh

sudo apt-get install openssh

然后启动服务

sudo service ssh start

一切都完成了! (当然除非你想创建密钥)

现在你可以通过 SSH 登录你的 Linux 机器了

ssh <USERNAME_ON_LINUX_MECHINE>@<LINUX_HOST_NAME>

Linux主机名主要是机器的外部IP地址。

(当然,你的mac上还需要安装openssh)

这是有关 SSH 隧道的完整教程

http://inside.mines.edu/fs_home/gmurray/HowTo/sshNotes.html

如何使用 x11vnc 服务器和客户端

我认为 vnc 是 SSH 的更好形式(我个人的观点)VNC 比 SSH 更容易安装

这是用于设置 vnc 的 arch-wiki 的链接 https://wiki.archlinux.org/index.php/X11vnc

  • 安装x11vnc

    sudo apt-get install x11vnc

  • 为您的用户创建密码:

    x11vnc -storepasswd

  • 如果您有 ssh 设置,则可以使用它来启动 x11vnc 假设您已经登录,但请记住告诉它使用您的密码文件:

    x11vnc -usepw

假设您使用 lightdm 进行登录,您可以解决此问题,您可以使用以下命令启动 x11vnc:

sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw

相关内容