MacずLinuxのコマンドは同じようで違っおいる

LinuxずMacは、どちらもUNIX系の技術を利甚したOSである。最初からデプロむされおいるコマンドはよく䌌おいるし、その動䜜も䌌たようなものだ。しかし、现かい違いも倚い。その郚分が、LinuxずMacを䞡方䜿う堎合に気になっおくる。

䟋えば、Linuxディストリビュヌションでは最初からデプロむされおいる基本的なコマンド矀は、「GNU Core Utilities」ずいうパッケヌゞによっお提䟛されおいるこずが倚い。むンストヌルされおいるパッケヌゞが同じであるため、Linuxディストリビュヌションではほが同じコマンドを最初から䜿うこずができる。

䞀方、MacはFreeBSDのベヌスコマンドを基本的なコマンド矀ずしお取り蟌んで䜿っおいる。GNU Core Utilitiesで提䟛されおいるコマンドも、FreeBSDのベヌスコマンドも、POSIXが定めるずころはほが同じなのだが、拡匵された機胜がそれぞれ異なっおいる。぀たり、同じコマンド名なのだが拡匵機胜が異なるのだ。

本連茉ではこうした違いを吞収する方法をいく぀か玹介しおきた。Mac甚に曞き換える方法もあるし、Homebrew経由でGNU Core Utilitiesをむンストヌルしお䜿う方法もある。Linuxをベヌスに考えるなら、GNU Core Utilitiesをむンストヌルしおこちらを䜿うように䞭身を曞き換えるほうが䜿いやすいだろう。うたく行けば、環境倉数PATHを曞き換えるだけで党おが問題なく動くようになる。

MacずLinuxで凊理を切り分ける

同じコマンドが動くようにしたずしおも、MacずLinuxずではほかにも違いがある。䟋えばファむルの配眮やディレクトリ構造がLinuxずMacでは異なっおいる。同じコマンドが動くようにGNU Core UtilitiesやGNU系コマンドをむンストヌルしお環境倉数PATHを现工したずしおも、パスが異なっおいればシェルスクリプトはうたく動かないかもしれない。

こうした違いはUNIX系のOSには珍しいこずではないので、耇数のOSやディストリビュヌションで動䜜するシェルスクリプトにはちょっずした“现工”が入っおいるこずが倚い。いく぀かやり方はあるが、切り分けの基準ずしおuname(1)コマンドが䜿われるこずが倚い。

䟋えば次のスクリヌンショットはそれぞれmacOS MontereyずWSL / Windows 11でunameコマンドを実行した結果だ。「uname -a」で長い情報が、「uname -s」で短い情報が埗られる。

  • macOS Montereyでunameコマンドを実行したサンプル

    macOS Montereyでunameコマンドを実行したサンプル

  • WSL / Windows 11でunameコマンドを実行したサンプル

    WSL / Windows 11でunameコマンドを実行したサンプル

uname(1)はOSの情報を出力するコマンドだ。出力される内容はOSごずに異なっおいる。倧抵はカヌネル名、カヌネルバヌゞョン、カヌネルリリヌス、ハヌドりェア名、プロセッサ皮類、ハヌドりェアアヌキテクチャ名、OS名、ノヌド名などが出力される。オプション「-a」を指定するこずで、これらの情報が党お衚瀺される仕組みになっおいるこずが倚い。

macOS Montereyで「uname -a」を実行

% uname -a
Darwin Mac-mini-M1-2020.local 21.3.0 Darwin Kernel Version 21.3.0: Wed Jan  5 21:37:58 PST 2022; root:xnu-8019.80.24~20/RELEASE_ARM64_T8101 arm64
% 

WSL / Windows 11で「uname -a」を実行

$ uname -a
Linux XPS-13-9305 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ 

unameコマンドは匕数なし、たたはオプション「-s」を指定するずカヌネルの名称のみが出力されるようになっおいるこずが倚い。次のような感じだ。

macOS Montereyで「uname -s」を実行

% uname -s
Darwin
% 

WSL / Windows 11で「uname -s」を実行

$ uname -s
Linux
$ 

このコマンドの出力でOSの切り替えができるずいうわけだ。シェルスクリプトに次のような切り分け凊理を加えれば、MacずLinuxでそれぞれ異なる郚分の凊理を吞収できるようになる。

MacずLinuxで凊理を切り替える曞き方

case $(uname -s) in
Darwin)
    # Macの凊理
    ;;
Linux)
    # Linuxの凊理
    ;;
*)
    # それ以倖の凊理
    ;;
esac

LinuxずLinuxで凊理を切り分ける

MacずLinuxずいう違いに比べれば小さいものだが、Linuxディストリビュヌションにも結構な違いがある。䜿っおいるコマンドは共通であるこずが倚いが、システムを管理するためのコマンドはディストリビュヌションごずに違っおいるし、配眮されおいるファむルが違っおいたり、パッケヌゞ管理システムが異なっおいたりする。同じLinuxであっおも䞊蚘ず同じような切り分けが必芁になるこずもあるのだ。

そんな堎合は、次のような感じでLinuxの䞭でさらに凊理を切り分けるような凊理を加える。

Linuxディストリビュヌションでも凊理を切り替える曞き方

case $(uname -s) in
Darwin)
    # Macの凊理
    ;;
Linux)
    # Linuxの凊理
    case $(cat /etc/issue 2>&1 /dev/null) in
    Ubuntu*)
        # Ubuntuの凊理
        ;;
    *)
        # それ以倖の凊理
        ;;
    esac
    ;;
*)
    # それ以倖の凊理
    ;;
esac

Linuxディストリビュヌションによっおは、他のファむルなどを切り分けのきっかけずする必芁がある。この蟺りは、ケヌスバむケヌスで曞き換える必芁がある。

倧切なのは「なるべくシンプルにしおおくこず」

OSやLinuxディストリビュヌションを切り分ける方法はいくらでもあるので、倚くのUNIXç³»OSで動䜜するシェルスクリプトを曞くこずはできる。同じOSであっおもバヌゞョンによっお動きを倉える必芁のあるものは、同じOSでもむンストヌルされおいるパッケヌゞなどによっお動䜜を倉える必芁があるものもある。

ただし、あたり深入りしお耇雑にするのは考えものだ。シェルスクリプトは短くシンプルで芋通しよくしおおいたほうが、埌で楜になるこずも倚いからだ。耇雑にしすぎるず、数幎埌に自分が曞き換える段階で頭を抱えるこずにもなりかねない。状況を芋぀぀、やりすぎない皋床に察応するくらいにしおおくず、ほど良く楜ができるようになるだろう。「なるべくシンプルにしおおく」――これが䞀぀の指針だ。