BASH:确定脚本是从虚拟机 (Ubuntu) 还是 W10 bash 应用程序调用的?
BASH: Determine if script was called from virtual machine (Ubuntu), or the W10 bash app?
有没有办法让 shell 脚本确定它是从虚拟机 运行ning Ubuntu 或 W10 中的终端调用的使用 bash
调用的终端(在 W10 中安装了 Ubuntu 应用程序)?
我在这两种环境中工作,并且有很多有用的 shell 脚本可以使我在虚拟机上的工作更有效率,例如打开特定的 URL 或 运行ning 组命令。我希望他们也能在 Windows 方面工作。但是,我的脚本设置的目录在我的 Windows 端必须不同。
我已经从 Windows 商店安装了 ubuntu 应用程序,它允许我打开 bash window 并获取文件。我可以只检查 ~
returns 是否是一个空字符串,但是有没有更可靠的方法呢?
我正在 运行宁 Windows 10,版本 17763 并使用 Ubuntu 18.04 LTS。
例如
C:\.sourceThis.sh
#!/bin/bash
myDir="/home/user/stuff"
cdMySub() {
cd "$myDir/"
}
我可以通过
在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 or VM user".
USER@XXXX:/mnt/c$ echo ~
/home/USER
因此,
tmpHome=~
if [[ "${tmpHome##*/}" == "USER" ]] ; then
# Windows user
elif [[ "${tmpHome##*/}" == "VM" ]] ; then
# VM user
fi
适用于我的特定用户。但是,我怀疑我想对不同的用户使用它(例如与同事分享)。这需要一种更健壮的方式。
我对 Linux 不太了解。我不知道如何在用户、流程和任务的世界中导航,我想这可以给出答案。
您始终可以使用 if 条件检查路径是否存在,然后 运行 那里的脚本 :
if [[ -f /home/user/stuff ]]; do
script if running on linux
else
script if running on windows
fi
这里的-f标志是一个bash条件检查指定路径的文件是否存在,returns如果存在则为真。您可以添加其他验证来检查文件是否也存在 运行ning on Windows 等等。
我已经成功使用了很长时间:
if [[ "$(uname -r)" == *Microsoft ]]; then
do stuff
fi
@Dexirian 和@Michael Hoffman 提出了一种有效的方法!
对我来说 uname -r
returns x.x.x-17763-Microsoft
来自 Windows 提示和 x.x.x-xx-generic
在我的虚拟机上。
因此,
if [[ "$(uname -r)" =~ "Microsoft" ]] ; then
myDir="/mnt/c/user/stuff"
elseif [[ "$(uname -r)" =~ "generic" ]] ; then
myDir="/home/user/stuff"
fi
很有魅力!
Bash 提供有关 运行 系统的信息,它是 MACHTYPE
、HOSTTYPE
和 OSTYPE
内置变量。
物理 Linux 系统的示例值是:
MACHTYPE=x86_64-redhat-linux-gnu
HOSTTYPE=x86_64
OSTYPE=linux-gnu
WSL Linux 系统的示例值是:
MACHTYPE=x86_64-pc-linux-gnu
HOSTTYPE=x86_64
OSTYPE=linux-gnu
检查系统是否为 WSL Linux 的一种可能方法是:
if [[ $MACHTYPE == *-pc-* ]]; then
...
fi
有没有办法让 shell 脚本确定它是从虚拟机 运行ning Ubuntu 或 W10 中的终端调用的使用 bash
调用的终端(在 W10 中安装了 Ubuntu 应用程序)?
我在这两种环境中工作,并且有很多有用的 shell 脚本可以使我在虚拟机上的工作更有效率,例如打开特定的 URL 或 运行ning 组命令。我希望他们也能在 Windows 方面工作。但是,我的脚本设置的目录在我的 Windows 端必须不同。
我已经从 Windows 商店安装了 ubuntu 应用程序,它允许我打开 bash window 并获取文件。我可以只检查 ~
returns 是否是一个空字符串,但是有没有更可靠的方法呢?
我正在 运行宁 Windows 10,版本 17763 并使用 Ubuntu 18.04 LTS。
例如
C:\.sourceThis.sh
#!/bin/bash
myDir="/home/user/stuff"
cdMySub() {
cd "$myDir/"
}
我可以通过
在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 or VM user".
USER@XXXX:/mnt/c$ echo ~
/home/USER
因此,
tmpHome=~
if [[ "${tmpHome##*/}" == "USER" ]] ; then
# Windows user
elif [[ "${tmpHome##*/}" == "VM" ]] ; then
# VM user
fi
适用于我的特定用户。但是,我怀疑我想对不同的用户使用它(例如与同事分享)。这需要一种更健壮的方式。
我对 Linux 不太了解。我不知道如何在用户、流程和任务的世界中导航,我想这可以给出答案。
您始终可以使用 if 条件检查路径是否存在,然后 运行 那里的脚本 :
if [[ -f /home/user/stuff ]]; do
script if running on linux
else
script if running on windows
fi
这里的-f标志是一个bash条件检查指定路径的文件是否存在,returns如果存在则为真。您可以添加其他验证来检查文件是否也存在 运行ning on Windows 等等。
我已经成功使用了很长时间:
if [[ "$(uname -r)" == *Microsoft ]]; then
do stuff
fi
@Dexirian 和@Michael Hoffman 提出了一种有效的方法!
对我来说 uname -r
returns x.x.x-17763-Microsoft
来自 Windows 提示和 x.x.x-xx-generic
在我的虚拟机上。
因此,
if [[ "$(uname -r)" =~ "Microsoft" ]] ; then
myDir="/mnt/c/user/stuff"
elseif [[ "$(uname -r)" =~ "generic" ]] ; then
myDir="/home/user/stuff"
fi
很有魅力!
Bash 提供有关 运行 系统的信息,它是 MACHTYPE
、HOSTTYPE
和 OSTYPE
内置变量。
物理 Linux 系统的示例值是:
MACHTYPE=x86_64-redhat-linux-gnu
HOSTTYPE=x86_64
OSTYPE=linux-gnu
WSL Linux 系统的示例值是:
MACHTYPE=x86_64-pc-linux-gnu
HOSTTYPE=x86_64
OSTYPE=linux-gnu
检查系统是否为 WSL Linux 的一种可能方法是:
if [[ $MACHTYPE == *-pc-* ]]; then
...
fi