it-swarm.com.de

Wie überprüfe ich, ob ein Programm in Bash unter Ubuntu unter Windows und nicht nur in Ubuntu ausgeführt wird?

Ziemlich einfach, die üblichen Stellen, an denen Sie herausfinden können, auf welchem ​​Betriebssystem Sie sich befinden, scheinen mit Ubuntu unter Ubuntu für Windows identisch zu sein. Zum Beispiel ist uname -a identisch mit einer nativen GNU/Linux-Installation und /etc/os-version identisch mit einer Ubuntu Trusty Tahr-Installation.

Das einzige, was ich mir vorstellen kann, ist zu überprüfen, ob /mnt/c/Windows existiert, aber ich bin mir nicht sicher, ob das eine narrensichere Idee ist.

20
DrKabob

Das Folgende funktioniert in Bash unter Windows 10, MacOS und Linux:

#!/bin/bash
set -e
if grep -qE "(Microsoft|WSL)" /proc/version &> /dev/null ; then
    echo "Windows 10 Bash"
else
    echo "Anything else"
fi

Sie müssen nach "Microsoft" und "WSL" suchen, indem Sie diesen Kommentar von Ben Hillis, WSL-Entwickler:

Derzeit ist dies wahrscheinlich der beste Weg, dies zu tun. Ich kann nicht versprechen, dass wir den Inhalt dieser ProcFs-Dateien niemals ändern, aber ich halte es für unwahrscheinlich, dass wir ihn in etwas ändern, das weder "Microsoft" noch "WSL" enthält.

/proc/sys/kernel/osrelease
/proc/version
23
Gary S. Weaver

Ich habe auch nach Wegen gesucht, das zu erkennen. Bisher habe ich 2 gefunden.

  • /proc/sys/kernel/osrelease ist "3.4.0-Microsoft"

  • /proc/version lautet "Linux Version 3.4.0-Microsoft ([email protected]) (gcc Version 4.7 (GCC)) # 1 SMP PREEMPT Mi Dez 31 14:42:53 PST 2014".

Wenn Sie nur die standardmäßig installierte Ubuntu-Distribution verwenden, sollte es keine Probleme mit deren Verwendung geben, da sie sagten, dass es unwahrscheinlich wäre, dass sie entweder auf etwas setzen, das nicht "Microsoft" oder "WSL" enthält .

Wenn Sie jedoch eine andere Linux-Distribution installieren, bin ich mir ziemlich sicher, dass sich der Inhalt von /proc/sys/kernel/osrelease und /proc/version ändern wird, da die Distribution nicht von Microsoft kompiliert worden wäre.

6
Adno

Ich habe mir das gerade für meine .bashrc ausgedacht, um ein paar WSL-Elemente zu $ ​​PATH hinzuzufügen.

Funktioniert in 1703. Nicht sicher, ob frühere Versionen.

if [[ $(uname -r) =~ Microsoft$ ]]; then
    foo
fi
1
Ryan

Windows-Subsystem für Linux 2 (WSL 2) in Windows 10 Pro Insider Preview Build 18917

/ proc/version enthält:

Linux Version 4.19.43-Microsoft-Standard (oe-user @ oe-Host) (gcc Version 7.3.0 (GCC)) # 1 SMP ...

0
gregln

Folgendes habe ich in mein .bashrc eingefügt

if [[ $(uname -v | sed -rE 's/^#[0-9]{3,}-(\S+).+/\1/') == "Microsoft" ]]; then
  # WSL-specific code
fi
  • uname -v erhält die Kernel-Version im Format #379-Microsoft Wed Mar 06 19:16:00 PST 2019 und der sed-Ausdruck holt den String Microsoft heraus.
0
Dan

Wenn Sie in Bash sind und fork vermeiden möchten:

is_wsl=0
read os </proc/sys/kernel/osrelease || :
if [[ "$os" == *Microsoft ]]; then
  is_wsl=1
fi
0
gavenkoa

Ohne dass ich etwas Besonderes tue, scheinen diese Umgebungsvariablen bereits gesetzt zu sein:

$ set | grep WSL
IS_WSL='Linux version 4.4.0-18362-Microsoft ([email protected]) (gcc version 5.4.0 (GCC) ) #1-Microsoft Mon Mar 18 12:02:00 PST 2019'
WSLENV=
WSL_DISTRO_NAME=Debian

Daher sollte in diesem Fall auch so etwas wie das folgende Snippet funktionieren (Beispiel für das, was ich selbst verwendet habe):

if [ ! -z "$IS_WSL" ]; then
    alias code='/mnt/c/Users/per/AppData/Local/Programs/Microsoft\ VS\ Code/Code.exe'
fi

(Beachten Sie, dass technisch gesehen -z prüft nicht, ob die Variable gesetzt ist , nur, dass sie leer ist; in der Praxis funktioniert dies in diesem Fall gut genug.)

0
Per Lundberg