BashスクリプトからOSを検出する方法は?


525

.bashrc.bash_loginファイルをバージョン管理下に置いて、使用するすべてのコンピュータ間でそれらを使用できるようにしたいと考えています。問題は、OS固有のエイリアスがあるため、スクリプトがMac OS X、Linux、またはCygwinで実行されているかどうかを確認する方法を探していたということです。

Bashスクリプトでオペレーティングシステムを検出する適切な方法は何ですか?


1
設定の共有を検討したことがありますか?私は同じ種類の設定を取得したいと思っていました:)
sorin

@sorin古いコメントであることはわかっていますが、それでも興味がある場合は、すべてのマシンにプラグ可能なbash環境を構成できるProfileGemを構築しています。
dimo414 2014年

1
@ dimo414 profilegemは、ここでbitbucket.org/dimo414/profilegemに移動されたようです。限り、一般的にはbashのconfigsを共有するものとして、これらのドットファイルのプロジェクトのいくつかを試してみてください。github.com/...
mahemoff

1
@mahemoff更新されたリンクに感謝します。コメントを編集できません。ProfileGemを実験している場合は、フィードバックやバグを歓迎します。
dimo414 2015年

私は再び私のリンクを更新する必要があるので、ああのBitbucketは、Mercurialのサポートの下回っている:( github.com/dimo414/ProfileGemは新しい家である。
dimo414

回答:


521

以下はうまくいくと思います。よくわかりませんwin32

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

7
Windowsでは、msysGit Bash / msysGitとcygwinCygwin を取得します
friederbluemle 2014

1
Windows用の検出方法を含むこの答えは良いです。私もMingw32を使用していて、次のように表示されますmsys
d48

2
興味深い.. Mac OSXはまだ「ダーウィン」を与えるでしょう。
ジョナサンベル2015

6
コメントをコマンドで置き換えると、私をつまずかせた何か-で終わることを確認してください;
Vadim Peretokin 2017年

1
のようなコマンドを追加するとsource somefile ; 、が表示されますsyntax error near unexpected token elif
oarfish

292

私の.bashrcには、次のコードを使用します。

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

それから私は次のようなことをします:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

醜いですが、動作します。case代わりに使用することもできifます。


6
unamestrを使用するのではなく、なぜunamestrからプラットフォームを設定するのですか?
csexton 2008

80
バッククォートを使用しないでください。新しい明確な構文 "unamestr = $(uname)"を使用してください。
アンワインド

15
一見すると、バッククォートは文字列に似ている可能性があります。
Harrison Powers

29
@ david-winieckiコマンドをネストする必要がある場合(例:$(command-1 $(command-2)))
Michael Barton

4
それははるかに良いことではないplatform="$(uname | tr '[:upper:]' '[:lower:]')"でしょうか?それから間違いなくケースを処理しますか?非常に特定の出力への依存関係をハードコーディングするのは奇妙に思えます。
Brandon Buck

274

bashのマンページには、変数OSTYPEにオペレーティングシステムの名前が格納されていると記載されています。

OSTYPEbashが実行されているオペレーティングシステムを説明する文字列に自動的に設定されます。デフォルトはシステム依存です。

linux-gnuこちらに設定されています。


5
また、$ OSTYPEは私のMac(Leopard)では 'darwin9.0'、Cygwinでは 'cygwin'です。
dF。

5
SnowLeopardでは、$ OSTYPEはdarwin10.0です。バージョンが追加されたWTF?単純なケースステートメントが機能しないことを意味します。
mxcl 2009

16
それを削除することはそれほど大したことではありません:os=${OSTYPE//[0-9.]/}
AB '

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
tripleee

36
@tripleeeまたは「if」構文に慣れている人向けif [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7

159

$OSTYPE

次のように、事前定義された$OSTYPE変数を単に使用できます。

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

ただし、それは古いシェルBourneシェルなど)では認識されません


uname

別の方法は、unameコマンドに基づいてプラットフォームを検出することです。

次のスクリプトを参照してください(.bashrcに含める準備ができています)。

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

あなたは私の中にいくつかの実用的な例を見つけることができます.bashrc


Travis CIで使用されている同様のバージョンは次のとおりです。

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

1
$ OSTYPEチェックには、Windowsマシンを示すcygwinのブランチがありません。unameチェックも正しく機能しません。cygwinでunameは "CYGWIN_NT-10.0"を返し、MinGWではunameは "MINGW64_NT-10.0"を返します。
Matt Pennington 2017年

1
エイリアスls = '/ bin / ls -G'は実際には安全なオプションです。OSベースの
バグ

私はを使用することをお勧めしunameます。Oracleは慣習を厳しくしており、無料のバージョン文字列をに付けていOSTYPE ==> solaris2.11ます。 uname少しすっきりとしていて、作業が少なくて済みます。
意志

37

オペレーティングシステムとCPUの種類を検出することは、移植性の高い方法で行うのは簡単ではありません。私は、sh非常に多種多様なUnixプラットフォームで動作する約100行のスクリプトを持っています。1988年以降に使用したすべてのシステムです。

重要な要素は

  • uname -pあるプロセッサの種類が、通常であるunknown近代的なUnixプラットフォーム上で。

  • uname -m 一部のUnixシステムでは「マシンハードウェア名」が表示されます。

  • /bin/archが存在する場合、通常はプロセッサのタイプを示します。

  • uname 引数を指定しないと、オペレーティングシステムが指定されます。

最終的には、プラットフォーム間の違いとそれらどの程度細かくしたいかについて考える必要があります。 たとえば、物事をシンプルに保つために、私はをi386介してi686、「Pentium*」と「AMD*Athlon*」をすべてとして扱いx86ます。

私は、~/.profileCPUとオペレーティングシステムの組み合わせを示す文字列に一つの変数を設定し、起動時にスクリプトを実行します。私は、プラットフォーム固有を持ってbinmanlib、およびincludeそれに基づいて設定しますディレクトリ。次に、環境変数のボートロードを設定します。したがって、たとえば、メールを再フォーマットするためのシェルスクリプトは、たとえば、$LIB/mailfmtプラットフォーム固有の実行可能バイナリを呼び出すことができます。

あなたがカットコーナーにしたい場合はuname -mと平野はunameあなたが多くのプラットフォーム上で知って欲しいものを教えてくれます。必要なときに他のものを追加します。(そしてcase、ネストではなくif!を使用してください)


2
unameコマンドによれば、パラメータなしのunameは、「-s」パラメータを使用することと同等です。「-sシステム名を表示します。このフラグはデフォルトでオンになっています。」明示的にするには、「uname」の代わりに「uname -s」を使用できます。(「シェル出力ヘルプ」への回答でいくらか詳しく説明されています
Peter Mortensen

OSとプロセッサのアーキテクチャを確実に検出するためのこの100スクリプトを含むgithub gitまたはpastebinへのリンクはありますか?
Andrew De Andrade 2013

4
@AndrewDeAndradeこのコードを公開するのは恥ずかしいです。pastebin.com/J66Lj6wf
ノーマンラムジー

ではどうuname -sですか?
Alexander Mills

35

この完全なbashコードを使用することをお勧めします

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

その他の例の例:https : //github.com/coto/server-easy-install/blob/master/lib/core.sh


1
小文字の関数を省略しました。答えを更新しました。
ロビンクロワーズ

1
それがLinuxであることがわかったら、(検索を自動化しようとせずに)単に調べているだけであればls /etc、「何とかリリース」を探すのが最も簡単なように思えます。 、その他
Chris Moschini、2014

1
OS変数への参照のいくつかは、「{$ OS}」私はそれをテストし、正しい方法だ「$ {OS}」にそれらを変更するよう書かれていたので、私は編集済み
bazz

スクリプトの最後に「echo $ {OS}」を追加することを検討しますか?
Oleg Kokorin

10

文書化されているよう$OSTYPE$HOSTTYPE、bashではandを使用します。これが私がすることです。それでも不十分な場合、unameまたはor uname -a(または他の適切なオプション)で十分な情報が得られない場合は、この目的のために作成されたGNUプロジェクトのconfig.guessスクリプトが常に存在します。


10

これらの回答のいくつかは避けることをお勧めします。他の形式の文字列比較を選択できることを忘れないでください。これにより、ほとんどのバリエーションまたは提供された醜いコードが明らかになります。

そのような解決策の1つは、次のような単純なチェックです。

if [[ "$OSTYPE" =~ ^darwin ]]; then

これには、バージョンのサフィックスにもかかわらず、どのバージョンのDarwinにも一致するという追加の利点があります。これLinuxは、予想されるあらゆるバリエーションでも機能します。

ここに私のドットファイル内のいくつかの追加の例を見ることができます


9

「uname」を使用してみてください。たとえば、Linuxの場合: "uname -a"。

マニュアルページによると、unameはSVr4およびPOSIXに準拠しているため、Mac OS XおよびCygwinで使用できるはずです。でもが、確認できません。

ところで:$ OSTYPEもlinux-gnuここに設定されます:)


パラメータがないと、unameはMac OS X(ヒョウ)で「ダーウィン」を出力します。-aを使用すると、大量の追加情報(カーネルのバージョン、アーキテクチャ、および私が解読できないその他の情報)が出力されます。cygwinでテストできない
デビッドロドリゲス-dribeas 2008

8

私は私の中にこれらの砂糖を書きました.bashrc

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

だから私は次のようなことができます:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"

ところで、これらの9行は、ほとんどすべてのBashで動作します。シェルアウトはなく、ほとんどすべてのスタイルの個人用.bashrc(大きなネストされたif / caseツリーまたは多数のランダムエイリアス)で動作します。IMO、それ以上のすべての答えからズボンを打ち負かします。
kfix

これまでのところ、Cygwinおよびその他のBSD(基本的には人気のある* NIXのコンパイル)を含めるために最も近い
HidekiAI

今日関連性があり、Bashを実行するユーザーランド向けに完了します。AIX / HP-UX / IRIX / OpenVMSのユーザーはすぐに利用できます。Linux用の新しいWindowsサブシステムは、ストックamd64 Ubuntuインストールを実行するため、if_nix gnu&の両方に対してtrueを返します if_os linux
kfix

1
@kfixはい、そうです。win10 bashサブシステムは、「linux-gnu」を出力しecho $OSTYPEます。具体的にはwin 10 bashサブシステムを検出するために、私が見つけた唯一の解決策は「Microsoft」をチェックすることでした/proc/sys/kernel/osrelease
Jpnh


7

私はGNU shtoolを使用してかなり正確なプラットフォーム検出を行う、個人用のBashライブラリとスクリプトフレームワーク作成しました。

GNU shtoolは、非常に移植性の高いスクリプトのセットであり、特に 'shtool platform'コマンドが含まれています。出力は次のとおりです。

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

いくつかの異なるマシンで:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

ご覧のとおり、これはかなり満足できる結果をもたらします。GNU shtoolは少し遅いので、実際には、スクリプトが呼び出すシステム上のファイルにプラットフォームIDを格納して更新します。それは私のフレームワークなので、私にとってはうまくいきますが、マイレージは異なる場合があります。

今、あなたはあなたのスクリプトでshtoolをパッケージ化する方法を見つける必要がありますが、それは難しい練習ではありません。常にuname出力に頼ることもできます。

編集:

config.guess(どういうわけか)テディの投稿を見逃しました。これらは非常によく似たスクリプトですが、同じではありません。個人的には他の用途にもshtoolを使用しており、私にとっては非常にうまく機能しています。



6

以下は、DebianおよびRedHatベースのLinux OS/ etc / lsb-releaseおよび/ etc / os-release(使用しているLinuxフレーバーによって異なります)を使用して検出し、それに基づいて簡単なアクションを実行する方法です。

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

出力例のためのUbuntu Linuxの場合:

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            

5

これは、すべてのディストリビューションで安全に使用できます。

$ cat /etc/*release

これはこのようなものを生成します。

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

必要に応じて変数を抽出/割り当てます

注:一部のセットアップでは。これにより、無視できるエラーが発生する場合もあります。

     cat: /etc/upstream-release: Is a directory

注:CentOSでは、これは次のようになります[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras 14

はい、私が投稿した出力は、ノートパソコンの1つからの例であり、どこにでもある静的なコンテンツではありません。
RJ

結果が常に同じ形式であると誰も思わないように追加しただけです:)
cfstras '

1
+1スクリプトの冒頭でset -eを使用しています(したがって、このソリューションはdoxer.org/linux-shell-centos-debian-ostypeで機能していません)。また、他のソリューションは特にCentOSをサポートしていません。しかし、私はこの回答を証明するこの参照を見つけましたunix.stackexchange.com/a/92212
gihanchanuka

4
Macでは機能しません:cat: /etc/*release: No such file or directory
eridal

3

これを試して:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

macOSで私は得るcat: /etc/*-release: No such file or directory
csexton

@csexton本当に、私は同じようになっています:zsh: no matches found: /etc/*release-これはLinuxシステムでのみ機能すると思います...
Alexander Nekrasov

この答えはLinuxでのみ機能します。しかし、他の回答では、他のシステムに対抗するだけでLinuxを検出できます。この基本的な発見は、特定のLinuxディストリビューションを発見するのにまったく役立ちませんが、FreeBSDとDarwinを区別するのと同じくらい重要です。
Thomas Urban

3

次のif句を使用して、必要に応じて拡張できます。

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi

2

いくつかのLinuxディストリビューションで上記のメッセージを試してみたところ、次のことが最もうまく機能することがわかりました。これは、WindowsのBashでも機能する、短くて簡潔な正確な単語の答えです。

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu

2
このコードスニペットは歓迎されており、いくつかの助けになるかもしれませんが、これが問題を解決する方法理由の説明含めると、大幅に改善されます。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください!回答を編集して説明を追加し、適用される制限と前提を示してください。
Toby Speight 2017年

1
ほとんどのLinuxシステムでは素晴らしく簡潔なようですが、残念ながら、これによりmacOSでエラーが発生します。おそらくこれはより「バッシュからLinuxディストリビューションのフレーバーを検出する
csexton

1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )これはエラーをスローせずに動作します。
Kuzeko 2018年

実際、これが正しい方法ですOS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Kuzeko

@Kuzeko残念ながら、これをmacOSで実行するとエラーが発生します。
csexton 2018年

1

私は、すべてのプラットフォームがアクセスできるファイル共有に.bashrcと.bash_aliasを保持する傾向があります。これが私の.bash_aliasの問題を克服する方法です:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

そして、私は例えば.bash_alias_Linuxを持っています:

alias ls='ls --color=auto'

このようにして、プラットフォーム固有のコードと移植可能なコードを別々に保持します。.bashrcでも同じことができます


1

これは、known一連のファイルをチェックして、LinuxディストリビューションがDebianかUbunuかを識別し、デフォルトで$OSTYPE変数に設定します。

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"

-1

以下を実行すると、ubuntuのチェックを正しく実行できます。

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
apt-getを使用しない他のLinuxシステムはどうですか?
Wilf

ubuntuはディストリビューションであり、オペレーティングシステムのクラスではありません。
ジッタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.