利用できるオプションの異なる hostname コマンドに対応する

hostname コマンドには複数の形態があるためたまに困ることがあります。

困ること

  • MSYS には net-tools が入ってない
    • coreutilshostname が入ってる
    • 特に Git for Windows のことです
  • CentOSDebian には net-toolshostname が入ってる
    • ただし net-tools とは独立したパッケージになってる
  • 利用できるオプションが違う
    • 前者のコマンドには --help--version しかオプションがない
    • 後者のコマンドにはいろいろオプションがある

という理由で、後者の存在をあてにしているスクリプトの実行に失敗する場合があります。

ワークアラウンド

  • 共通するオプション --version を指定したときの出力文字列を解析します
  • coreutils が含まれているなら coreutils 版で、そうでないなら net-tools 版です

手元では環境変数 PATH の前のほうに(bin より前)、次のようなラッパースクリプトを置くことにしてます。

#!/bin/bash
# hostname

if [[ ! -e /bin/hostname ]]; then
    echo "${HOSTNAME}"
    exit
fi

if /bin/hostname --version | grep coreutils >/dev/null 2>&1; then
    /bin/hostname
    exit
fi

/bin/hostname "$@"