在Linux和FreeBSD之间使bash脚本可移植的正确方法是什么?

bry*_*edy 11 linux bash freebsd

我正在研究一些我希望在我的Linux和FreeBSD系统上工作的bash脚本.

因为我主要在Linux工作,所以我习惯用它来启动我的bash脚本

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

但是由于bash存在,这对FreeBSD无效/usr/local/bin/bash.所以在FreeBSD上我的脚本需要从头开始

#!/usr/local/bin/bash
Run Code Online (Sandbox Code Playgroud)

那么我可以使用其他可以跨两个系统移植的东西吗?我宁愿不维护两个版本的脚本.

Bri*_*new 18

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

应该这样做,只要bash在某个地方的路径上.有关详细信息,请参见此处


小智 6

老实说,如果你想要可移植性,请调用/ bin/sh和代码到POSIX.它不那么漂亮,但如果你这样做,你会遇到更少的潜在问题.

  • 虽然,对于记录:/ bin/sh通常不是POSIX shell.基本上每个现代系统都附带一个POSIX shell,但是(例如在Solaris上),为了与旧脚本兼容,/ bin/sh被保留为旧的POSIX之前的shell.按名称查找bash(使用/ usr/bin/env),但之后不使用任何bashisms,这是确保脚本在POSIX shell中运行的好方法.但是,并非所有系统(例如BSD)都带有bash.可悲的是,没有完美的hashbang可以让你在所有unix系统上获得POSIX shell,所以我们这些必须编写在每个平台上运行的脚本的人都必须使用一些魔法... (3认同)