回答:
通常、uname
さまざまなオプションを使用すると、どの環境で実行しているかがわかります。
pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin
pax> uname -s
CYGWIN_NT-5.1
そして、非常に参考に応じてschot
(コメントで)、uname -s
与えDarwin
OSX用とLinux
私のCygwinは与えながら、Linux用CYGWIN_NT-5.1
。ただし、さまざまなバージョンを試す必要がある場合があります。
したがって、bash
このようなチェックを行うコードは次のようになります。
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
ここでは実際に CygWin(そのbash
シェル)内で実行していると想定しているため、パスはすでに正しく設定されているはずです。あるコメンターが注記しているように、bash
プログラムを実行してスクリプトを渡すことができます。cmd
これにより、必要に応じてパスが設定されない可能性があります。
その場合は、おそらく事前にパスを変更するか、実行可能ファイルの場所(たとえば/c/cygwin/bin/uname
)を完全に指定して、正しい実行可能ファイル(CygWinなど)が呼び出されていることを確認する必要があります。
MINGW32_NT-6.1
です。また、何も存在しない/cygdrive
だけで、接頭辞/c
のためにC:
。
How can a shell/bash script detect ...
を扱っておらず、他の回答は扱っているため、他の回答を推奨しました。
uname -s
ものを呼び出しuname
ます。これは、私のシステムgeda
では、テキストを返すインストールバージョンですWindowsNT
。ただし、上記のMinGWバージョンでもかまいません。cygwinの信頼できる検出は、パスが適切に設定されているIMOに依存してはなりません。したがって、cygwinを検出する$(uname -s)
ように変更する必要があります$(/bin/uname -s)
。
#!/usr/bin/env bash
代わりに#!/bin/sh
を使用して/bin/sh
、異なるプラットフォームの異なるデフォルトシェルにリンクすることによって引き起こされる問題を回避します。そうしないと、予期しない演算子のようなエラーが発生します。これは私のコンピューターで発生しました(Ubuntu 64ビット12.04)。expr
インストールしないとプログラムがないので、を使用しますuname
。uname
システム情報(-s
パラメーター)を取得するために使用します。expr
and substr
を使用します。if
elif
fi
マッチングジョブを実行するために使用します。uname -s
。仕様に従ってください。#!/usr/bin/env bash
if [ "$(uname)" == "Darwin" ]; then
# Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
# Do something under GNU/Linux platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
# Do something under 32 bits Windows NT platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
# Do something under 64 bits Windows NT platform
fi
[ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]
。
"$(expr substr $(uname -s) 1 5)"
は少し変です。これを行うには、もっときれいな方法がありますif [ `uname -s` == CYGWIN* ]; then
。例:読む:CYGWINでuname -s
始まる場合...
if [[ $(uname -s) == CYGWIN* ]]; then
uname -s
「Linux」以外のものが生成される最新のLinuxディストリビューションの例はありますか?
使用uname -s
(--kernel-name
)ので、uname -o
(--operating-system
)などの一部のオペレーティングシステムでサポートされていませんマックOSおよびSolarisの。デフォルトの引数は()なので、uname
引数なしで使用することもできます。-s
--kernel-name
以下のスニペットは必要ありません バッシュ(つまり、必要ありません#!/bin/bash
)
#!/bin/sh
case "$(uname -s)" in
Darwin)
echo 'Mac OS X'
;;
Linux)
echo 'Linux'
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
echo 'MS Windows'
;;
# Add here more strings to compare
# See correspondence table at the bottom of this answer
*)
echo 'Other OS'
;;
esac
以下Makefile
はGitプロジェクト(config.mak.uname
)から発想を得たものです。
ifdef MSVC # Avoid the MingW/Cygwin sections
uname_S := Windows
else # If uname not available => 'not'
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
endif
# Avoid nesting "if .. else if .. else .. endif endif"
# because maintenance of matching if/else/endif is a pain
ifeq ($(uname_S),Windows)
CC := cl
endif
ifeq ($(uname_S),OSF1)
CFLAGS += -D_OSF_SOURCE
endif
ifeq ($(uname_S),Linux)
CFLAGS += -DNDEBUG
endif
ifeq ($(uname_S),GNU/kFreeBSD)
CFLAGS += -D_BSD_ALLOC
endif
ifeq ($(uname_S),UnixWare)
CFLAGS += -Wextra
endif
...
こちらもご覧ください uname -s
およびに関するこの完全な回答Makefile
。
この回答の下部にある対応表は、Wikipediaの記事からのものuname
です。最新の状態に保つために貢献してください(回答を編集するか、コメントを投稿してください)。また、ウィキペディアの記事を更新し、コメントを投稿して、あなたの貢献について通知することもできます;-)
Operating System
uname -s
Mac OS X
Darwin
Cygwin 32-bit (Win-XP)
CYGWIN_NT-5.1
Cygwin 32-bit (Win-7 32-bit)
CYGWIN_NT-6.1
Cygwin 32-bit (Win-7 64-bit)
CYGWIN_NT-6.1-WOW64
Cygwin 64-bit (Win-7 64-bit)
CYGWIN_NT-6.1
MinGW (Windows 7 32-bit)
MINGW32_NT-6.1
MinGW (Windows 10 64-bit)
MINGW64_NT-10.0
Interix (Services for UNIX)
Interix
MSYS
MSYS_NT-6.1
MSYS2
MSYS_NT-10.0-17763
Windows Subsystem for Linux
Linux
Android
Linux
coreutils
Linux
CentOS
Linux
Fedora
Linux
Gentoo
Linux
Red Hat Linux
Linux
Linux Mint
Linux
openSUSE
Linux
Ubuntu
Linux
Unity Linux
Linux
Manjaro Linux
Linux
OpenWRT r40420
Linux
Debian (Linux)
Linux
Debian (GNU Hurd)
GNU
Debian (kFreeBSD)
GNU/kFreeBSD
FreeBSD
FreeBSD
NetBSD
NetBSD
DragonFlyBSD
DragonFly
Haiku
Haiku
NonStop
NONSTOP_KERNEL
QNX
QNX
ReliantUNIX
ReliantUNIX-Y
SINIX
SINIX-Y
Tru64
OSF1
Ultrix
ULTRIX
IRIX 32 bits
IRIX
IRIX 64 bits
IRIX64
MINIX
Minix
Solaris
SunOS
UWIN (64-bit Windows 7)
UWIN-W7
SYS$UNIX:SH on OpenVMS
IS/WB
z/OS USS
OS/390
Cray
sn5176
(SCO) OpenServer
SCO_SV
(SCO) System V
SCO_SV
(SCO) UnixWare
UnixWare
IBM AIX
AIX
IBM i with QSH
OS400
HP-UX
HP-UX
~/.profile
($PATH
後世に検索キーワードを提供するためにコメントするような環境変数を設定するため)。
uname -sr
して比較Linux*Microsoft)
することLinux*)
です。
Bashはシェル変数OSTYPEを設定します。からman bash
:
bashが実行されているオペレーティングシステムを説明する文字列に自動的に設定されます。
これには、uname
新しいプロセスを起動する必要がないため、実行が速くなるという小さな利点があります。
しかし、期待値の信頼できるリストを見つけることができません。Ubuntu 14.04では、「linux-gnu」に設定されています。私は他のいくつかの価値のためにウェブをかき集めました。したがって:
case "$OSTYPE" in
linux*) echo "Linux / WSL" ;;
darwin*) echo "Mac OS" ;;
win*) echo "Windows" ;;
msys*) echo "MSYS / MinGW / Git Bash" ;;
cygwin*) echo "Cygwin" ;;
bsd*) echo "BSD" ;;
solaris*) echo "Solaris" ;;
*) echo "unknown: $OSTYPE" ;;
esac
アスタリスクは場合によっては重要です。たとえば、OSXは「darwin」の後にOSバージョン番号を追加します。「win」の値は実際には「win32」であると聞いていますが、「win64」はあるのでしょうか。
おそらく、ここで検証された値のテーブルを作成するために協力することができます。
linux-gnu
cygwin
msys
(既存のエントリと異なる場合は値を追加してください)
env | grep OSTYPE
、の下には表示されませんが、下に表示されますset | grep OSTYPE
OSTYPE
変数(conftypes.h)は、ビルド時にautomakeのOS
変数(Makefile.in)の正確なコピーを使用して構成されます。automakeのlib / config.subファイルで、利用可能なすべてのタイプを調べることができます。
アルバートの答えに基づいて、私は$COMSPEC
Windowsの検出に使用するのが好きです:
#!/bin/bash
if [ "$(uname)" == "Darwin" ]
then
echo Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]
then
echo Do something under Linux platform
elif [ -n "$COMSPEC" -a -x "$COMSPEC" ]
then
echo $0: this script does not support Windows \:\(
fi
これにより、のWindows名の$OS
バリアントの解析、およびuname
、MINGW、Cygwinなどの。
背景:%COMSPEC%
コマンドプロセッサ(Windowsシェルとも呼ばれます)への完全パスを指定するWindows環境変数です。この変数の値は通常%SystemRoot%\system32\cmd.exe
であり、通常はに評価されC:\Windows\system32\cmd.exe
ます。
# This script fragment emits Cygwin rulez under bash/cygwin
if [[ $(uname -s) == CYGWIN* ]];then
echo Cygwin rulez
else
echo Unix is king
fi
uname -sコマンドの最初の6文字が「CYGWIN」の場合、cygwinシステムが想定されます。
if [ `uname -s` == CYGWIN* ]; then
見栄えがよく、同じように動作します。
[[ $(uname -s) == CYGWIN* ]]
。また、拡張正規表現の方が私たちのケースではより正確であることにも注意してください[[ $(uname -s) =~ ^CYGWIN* ]]
。
expr substr $(uname -s) 1 6
エラー(expr: syntax error
)が発生するため、より適切に機能します。
はい、こちらが私のやり方です。
osis()
{
local n=0
if [[ "$1" = "-n" ]]; then n=1;shift; fi
# echo $OS|grep $1 -i >/dev/null
uname -s |grep -i "$1" >/dev/null
return $(( $n ^ $? ))
}
例えば
osis Darwin &&
{
log_debug Detect mac osx
}
osis Linux &&
{
log_debug Detect linux
}
osis -n Cygwin &&
{
log_debug Not Cygwin
}
私はこれを私のドットファイルで使用します
http://en.wikipedia.org/wiki/Uname
あなたが必要とするすべての情報。グーグルはあなたの友達です。
uname -s
システム名を照会するために使用します。
Darwin
CYGWIN_...
LINUX
ほとんどのunameの答えは、主に清潔さの点では無敵だと思います。
実行にはばかげた時間がかかりますが、実行可能ファイルを呼び出さないので、特定のファイルの存在をテストすることで、より良い迅速な結果が得られることがわかりました。
そう、
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
クイックBashファイルの存在チェックを使用するだけです。今はWindowsを使用しているので、LinuxやMac OS X用の特定のファイルを頭から言うことはできませんが、ファイルが存在することは間違いありません。:-)