在过去的 5 年里,我一直使用 Linux 作为我执行科学计算的日常操作系统。我的工作最近给了我一台 Mac,我将成为接下来几个月的主要用户。我一直遇到 Mac 上的 Free-BSD bash 环境和我习惯的 GNU 环境之间的冲突,无论是使用我设置的 bash 脚本还是当我尝试运行 bash 命令(coreutils
、findutils
等)时。我不想完全切换到 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 提供另一个查找程序的地方。
脚注
- 例如
/usr/local/bin/gmv
→../Cellar/coreutils/$version/bin/gmv
相关文章
答案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