2016-08-05 10 views
7

Robię skrypt basha. Mój niestandardowy bashrc, żeby być bardziej precyzyjnym. Muszę mieć osobne konfiguracje, w zależności od tego, w jakim "Linux" jestem (podsystem Windows 10 Linux lub rzeczywisty Linux).Jak odróżnić Linuxa od Windowsa 10 bash podczas tworzenia skryptów bashowych

Jak mogę je odróżnić?

Czego próbowałem:

  1. $OSTYPE - zarówno powrócić linux-gnu
  2. uname -a - zarówno powrócić podobny Linux COMPUTER_NAME_HERE 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
  3. lsb_release -a - zarówno powrócić ubuntu xx.xx
  4. cat /etc/issue.net - zarówno powrócić Ubuntu 14.04.4 LTS
  5. ld -v - zarówno powrót GNU ld (GNU Binutils for Ubuntu) 2.24

Jedynym sposobem znalazłem do tej pracy jest przedstawienie jakiegoś konkretnego użytkownika na podsystem Windows i używać $USER, ale to nie jest opcja, jestem gotów do użycia. Potrzebuję tego do pracy po wyjęciu z pudełka, bez niestandardowych nazw użytkowników, zmiennych środowiskowych itp.

+0

Hmm, co to jest podsystem Linux dla Windows 10? Jak to zainstalować? W każdym razie myślę, że każdy bash Windows rozpoznaje ścieżki w stylu Windows, które zawierają litery dysków, więc sprawdź, czy 'c: /' istnieje, a './c: /' nie. –

+0

@ n.m. Jest to coś takiego, jak system Linux pod oknami. Nie jak vagrant czy inni (gdzie uruchamiasz linux jako system wirtualny), ale raczej komendy linuxowe, przetłumaczone na windows (na poziomie jądra). Nie mogę tego więcej wytłumaczyć, ponieważ sam się o tym uczę .. Wystarczy google "ubuntu na windows" i znajdziesz go. Muszę powiedzieć, że jestem całkiem podekscytowany tym, ponieważ uwielbiam okna, ale ciężko jest użyć go jako systemu operacyjnego. (Szczególnie dla RubyOnRails) – PragmaticEd

+0

Ah, więc to jest jak wino w innym kierunku. Schludny! –

Odpowiedz

5

Zobacz /proc/sys/kernel/osrelease

można sprawdzić dla Windows z grep -qi Microsoft /proc/sys/kernel/osrelease 2> /dev/null

+0

Nie jestem pewien, że jest to technicznie poprawne, ponieważ nie mam bashów w systemie Windows, ale byłoby to o wiele lepsze rozwiązanie niż zaakceptowane, jeśli jest poprawne ponieważ sprawdzasz coś, co nie byłoby dwuznaczne. Prawdopodobnie istnieje również porównywalny/sys/content, chociaż stary linux może nie mieć/sys lub może być niekompletny, ale dla pozytywnego dopasowania nie ma to znaczenia. Wolę raczej iść bezpośrednio do/sys niż używać/proc, jeśli to możliwe. – Lizardx

+0

Jest to o wiele lepszy sposób, ponieważ okno bash zwraca '3.4.0-Microsoft' – PragmaticEd

4

Okey, znalazłem odpowiedź. Mogę użyć czek katalogów /mtn/c/Users, że będzie tylko w Windows Linux podsystem tak:

if [ -d "/mnt/c/Users" ]; then 
    echo "this is windows 10 bash" 
fi 

Więc mój kod końcowy wygląda tak, w przypadku gdy ktoś potrzebuje tej:

# get "OS type" 
# * linux 
# * linux_vagrant 
# * windows_bash 
# * windows_git 
# ------------------------------------------- 
if [ $OSTYPE=="msys" ]; then 
    MY_BASH_OS="windows_git" 
elif [[ $OSTYPE=="linux-gnu" || -d "/mnt/c/Users" ]]; then 
    MY_BASH_OS="windows_bash" 
elif [[ $OSTYPE=="linux-gnu" || $USER=="vagrant" ]]; then 
    MY_BASH_OS="linux_vagrant" 
elif [ $OSTYPE=="linux-gnu" ]; then 
    MY_BASH_OS="linux" 
else 
    echo "NO OS DETECTED. Exiting my_bash" 
    return 
fi 

AKTUALIZACJA: laktak Dało lepsze rozwiązanie, to znaczy sprawdzanie /proc/sys/kernel/osrelease, które jest 3.4.0-Microsoft dla systemu Windows bash.

+0

To rozsądna heurystyka, ale ktoś może mieć dysk Windows zamontowany jako '/ mnt/c' w środowisku, które nie jest Windows. – tripleee

+1

@tripleee Fair point. Ale jest to najlepsze rozwiązanie, jakie mogłem wymyślić. Czy masz lepsze rozwiązania? – PragmaticEd

+0

@PragmaticEd Sir, zasługujesz na ciasteczko. Moja wiedza na temat bitu W10 jest ograniczona, ale czy mogę też zaproponować zainstalowanie oprogramowania lub ENV var, które są obecne tylko w systemie Linux, a nie w W10? –

Powiązane problemy