windows - BASH:确定脚本是从虚拟机(Ubuntu)还是W10 bash应用程序调用的?

标签 windows bash shell ubuntu windows-subsystem-for-linux

有没有办法让 shell 脚本确定它是从运行 Ubuntu 的虚拟机中的终端调用,还是使用 bash 调用从 W10 终端调用(已安装的 Ubuntu 应用程序在W10)?

我在这两种环境中工作,并且有很多有用的 shell 脚本来使我在虚拟机上的工作更加高效,例如打开特定的 URL 或运行命令集。我希望它们也能在 Windows 端工作。但是,我的脚本设置的目录在我的 Windows 端必须有所不同。

我已经从 Windows 应用商店安装了 ubuntu 应用程序,它允许我打开 bash 窗口并获取文件。我可以检查 ~ 是否返回空字符串,但是有更可靠的方法吗?

我正在运行 Windows 10 版本 17763 并使用 Ubuntu 18.04 LTS .


例如

C:\.sourceThis.sh

#!/bin/bash

myDir="/home/user/stuff"

cdMySub() {
    cd "$myDir/$1"
}

我可以通过以下方式在 Windows 终端中运行它

C:\> bash
USER@XXXX:/mnt/c/$ source ./.sourceThis.sh
USER@XXXX:/mnt/c/$ cdMySub someSubDirectoryName
-bash: cd: /home/user/stuff/someSubDirectoryname: No such file or directory
USER@XXXX:/mnt/c/$   #Fail!

但是它不起作用,因为 Ubuntu 文件系统与 Windows 不同。

我想将 .sourceThis.sh 更改为类似的内容

...
if [[ "Something that detects virtual machine" ]] ; then
    myDir="/home/user/stuff"
elif [[ "Something that detects 'bash' from Windows prompt" ]] ; then
    myDir="/mnt/c/user/stuff"
fi

所以结果是

C:\> bash
USER@XXXX:/mnt/c/$ source ./.sourceThis.sh
USER@XXXX:/mnt/c/$ cdMySub someSubDirectoryName
USER@XXXX:/mnt/c/stuff/someSubDirectoryName$   #Yeay, success!

编辑:

我不能只检查默认目录的有效性,因为如果该目录不存在,脚本就会创建该目录。我希望它指向另一个默认路径。

我使用不同的用户名,因此我可以检查 ~ 的输出是否是“Windows 或 VM 用户”。

USER@XXXX:/mnt/c$ echo ~
/home/USER

因此,

tmpHome=~
if [[ "${tmpHome##*/}" == "USER" ]] ; then
    # Windows user
elif [[ "${tmpHome##*/}" == "VM" ]] ; then
    # VM user
fi

适用于我的特定用户。但是,我怀疑我想在不同的用户上使用它(例如与同事共享)。这需要一种更稳健的方式。

我对 Linux 没有太多经验。我不知道如何浏览用户、流程和任务的世界,我怀疑这可以给出答案。

最佳答案

我已经成功使用了很长时间:

if [[ "$(uname -r)" == *Microsoft ]]; then
    do stuff
fi

关于windows - BASH:确定脚本是从虚拟机(Ubuntu)还是W10 bash应用程序调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59773001/

相关文章:

c++ - 如何在 C++ 中使用 Windows DLL(后期绑定(bind))方法?

linux - 如何在 shell 脚本中终止进程

bash - 在后台 Python 脚本完成之前防止关机/重启

regex - 如何在 POSIX 正则表达式中将连字符转义为字符范围

Bash 返回语句中出现非法数字错误

c++ - 如何准备一个恒定的基准环境

python 3 : Identify if a python script is executed by bash or powershell

linux - 为什么/usr/bin/timeout 会杀死整个管道?

linux - shell命令删除文本文件中的行,其中包含特定文本

c# - UuidCreate 是否使用 CSPRNG?