你可以在 Windows 上为 Ubuntu Bash 执行此操作

你可以在 Windows 上为 Ubuntu Bash 执行此操作

我正在设置的计算机有三个分区,一个用于 Windows 10,一个用于 Linux,一个用于它们之间共享的文件和程序。有没有办法在第三个分区上安装程序(如 Python、PyCharm、MATLAB 等)以在两个操作系统上运行,还是我必须在每个操作系统上安装各自版本的 Python、C++ 等?第三个分区是否仅限于共享文件,还是可以用于共享 IDE、应用程序、编译器和解释器?

答案1

您将无法在第三个分区中安装程序,以便它们可以在两个操作系统上运行。您需要根据您的操作系统进行不同的下载,这是有原因的,每个操作系统对软件的要求都不同。

如果需要,您应该能够将其设置为共享许可证,并且您可能能够将其设置为自动共享生成的文件,甚至可能是 IDE 设置,但程序本身必须安装在每个系统中。

一种解决方法可能是设置从一个操作系统到另一个操作系统的 x11 转发,但这需要您同时运行两个操作系统,这会非常不稳定。

附注:如果您有 2 个分区,分别是 Ubuntu 而不是 Ubuntu 和 Windows,这可能是可行的。

答案2

对于几乎所有程序来说,不是。这是因为 Windows 和 Linux 具有不同的 API(应用程序编程接口)调用和系统调用。API 是函数,定义程序如何相互通信。通常,它们包含在库中或可能是操作系统的一部分。系统调用定义程序如何从内核请求硬件支持/活动。可以将一个操作系统的 API 调用和系统调用转换为另一个操作系统,但这需要付出巨大的努力。WINE 实际上是将 Windows API 转换为 POSIX(例如 Linux)API 的一个典型示例。这在 Windows 和 Linux 之间创建了一个兼容层,允许一些 Windows 软件在 Linux 上运行。此外,Windows 和 Linux 具有不同的二进制可执行格式。Windows 具有可移植可执行 (PE) 格式,而 Linux 具有 ELF(可执行可链接格式)。

尽管如此,我认为如果不付出巨大努力,你无法实现你想要实现的目标。也许(很有可能)你可以在共​​享分区上安装 WINE 并对其进行配置,以便它可以同时容纳 Windows 和 Linux 的程序。但这是一个荒谬的理论。Jeff 这位用户所说的有关许可证和其他文件的内容更有可能实现,而且更容易实现。

答案3

你可以在 Windows 上为 Ubuntu Bash 执行此操作

这是我的分区设置:

$ lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,MODEL
NAME        FSTYPE LABEL            MOUNTPOINT   SIZE MODEL
sda                                            931.5G HGST HTS721010A9
├─sda4      ntfs   WINRETOOLS                    450M 
├─sda2                                           128M 
├─sda5      ntfs   Image                        11.4G 
├─sda3      ntfs   HGST_Win10       /mnt/d       919G 
└─sda1      vfat   ESP                           500M 
nvme0n1                                          477G Samsung SSD 960 PRO 512GB           
├─nvme0n1p5 ext4   NVMe_Ubuntu_16.0 /           44.6G 
├─nvme0n1p3                                       16M 
├─nvme0n1p1 ntfs                                 450M 
├─nvme0n1p6 swap   Linux Swap       [SWAP]       7.9G 
├─nvme0n1p4 ntfs   NVMe_Win10       /mnt/c     414.9G 
├─nvme0n1p2 vfat                    /boot/efi     99M 
└─nvme0n1p7 ntfs   Shared_WSL+Linux /mnt/e         9G 

nvme0n1p7在 Windows 和 Ubuntu 之间共享

我设置了一个 9 GB 的分区,WSL(适用于 Linux 的 Windows 子系统)和 Ubuntu 都可以在其路径中拥有并运行程序。这是它的树:

$ sudo tree /mnt/e -d 
/mnt/e
├── bin
├── boot
│   └── grub
│       ├── fonts
│       ├── i386-pc
│       └── locale
├── Desktop
├── Documents
├── Downloads
│   └── WinScreeny-master
├── etc
│   ├── apt
│   │   ├── sources.list.d
│   │   └── trusted.gpg.d
│   ├── cron.d
│   │   └── test-directory
│   ├── cron.daily
│   ├── cron.hourly
│   ├── cron.monthly
│   ├── cron.weekly
│   ├── default
│   ├── ssmtp
│   └── systemd
│       ├── network
│       ├── system
│       │   ├── bluetooth.target.wants
│       │   ├── default.target.wants
│       │   ├── display-manager.service.wants
│       │   ├── final.target.wants
│       │   ├── getty.target.wants
│       │   ├── graphical.target.wants
│       │   ├── hibernate.target.wants
│       │   ├── hybrid-sleep.target.wants
│       │   ├── multi-user.target.wants
│       │   ├── network-online.target.wants
│       │   ├── paths.target.wants
│       │   ├── printer.target.wants
│       │   ├── sleep.target.wants
│       │   ├── sockets.target.wants
│       │   ├── suspend.target.wants
│       │   ├── sysinit.target.wants
│       │   └── timers.target.wants
│       └── user
├── lib
│   └── systemd
│       └── system-sleep
├── $RECYCLE.BIN
│   └── S-1-5-21-1568003092-1971238075-3041751339-1001
├── System Volume Information
├── Temporary Work
├── usr
│   ├── local
│   │   └── bin
│   │       ├── bell
│   │       │   └── sounds
│   │       ├── startup-scripts
│   │       └── zap
│   │           └── Assembly-Intro-hello
│   │               ├── BeOS
│   │               ├── FreeBSD
│   │               └── Linux
│   └── share
│       └── plymouth
│           └── themes
│               ├── details
│               ├── earth-sunrise
│               ├── text
│               ├── tribar
│               ├── ubuntu-logo
│               └── ubuntu-text
└── wsl-linux-tmp

71 directories

制作混合程序

我使用了我的一个 bash 程序:Ubuntu 中在一定时间后锁定屏幕的应用程序并对其进行了修改,使其能够识别在 Windows 10 下运行时的情况,并发出powershell命令而不是 Ubuntu 命令来发出消息气泡和系统声音。

例如,这里有一个代码片段,用于检查环境是否是 Windows 并使用与 Ubuntu 不同的命令:

if [[ $WSL_running == true ]]; then  
    powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\notify.wav").PlaySync();'
else
    ogg123 '/usr/share/sounds/ubuntu/stereo/phone-outgoing-calling.ogg' ;
fi

以下是应用程序成为 Windows / Ubuntu 混合版本后的完整 bash 代码:

$ cat /mnt/e/bin/lock-screen-timer
#!/bin/bash

# NAME: lock-screen-timer
# PATH: $HOME/bin
# DESC: Lock screen in x minutes
# CALL: Place on Desktop or call from Terminal with "lock-screen-timer 99"
# DATE: Created Nov 19, 2016. Last revision Nov 12, 2017.
# UPDT: Updated to support WSL (Windows Subsystem for Linux)

# NOTE: Time defaults to 30 minutes.
#       If previous version is sleeping it is killed.
#       Zenity is used to pop up entry box to get number of minutes.
#       If zenity is closed with X or Cancel, no screen lock timer is launched.
#       Pending lock warning displayed on-screen at set intervals.
#       Write time remaining to ~/.lock-screen-timer-remaining

MINUTES="$1" # Optional parameter 1 when invoked from terminal.

# if no parameters set default MINUTES to 30
if [ $# == 0 ]; then
    MINUTES=30
fi

DEFAULT="$MINUTES" # When looping, minutes count down to zero. Save deafult for subsequent timers.

# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
    kill "$PREVIOUS"
    rm ~/.lock-screen-timer-remaining
    zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi

# Running under WSL (Windows Subsystem for Linux)?
if cat /proc/version | grep Microsoft; then
    WSL_running=true
else
    WSL_running=false
fi


while true ; do # loop until cancel

    # Get number of minutes until lock from user
    MINUTES=$(zenity --entry --title="Lock screen timer" --text="Set number of minutes until lock" --entry-text="$DEFAULT")

    RESULT=$? # Zenity return code
    if [ $RESULT != 0 ]; then
        break ; # break out of timer lock screen loop and end this script.
    fi

    DEFAULT="$MINUTES" # Save deafult for subsequent timers.
    if [[ $MINUTES == 0 ]] || [[ $MINUTES == "" ]]; then
        break ; # zero minutes considered cancel.
    fi

    # Loop for X minutes, testing each minute for alert message.
    (( ++MINUTES )) 
    while (( --MINUTES > 0 )); do
        case $MINUTES in 1|2|3|5|10|15|30|45|60|120|480|960|1920)
            notify-send --urgency=critical --icon=/usr/share/icons/gnome/256x256/status/appointment-soon.png "Locking screen in ""$MINUTES"" minute(s)." ;
            if [[ $WSL_running == true ]]; then  
                powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\notify.wav").PlaySync();'
            else
               ogg123 '/usr/share/sounds/ubuntu/stereo/phone-outgoing-calling.ogg' ;
            fi
           ;;
        esac;

        # Record number of minutes remaining to file other processes can read.
        echo "$MINUTES Minutes" > ~/.lock-screen-timer-remaining

        sleep 60

    done

    rm ~/.lock-screen-timer-remaining # Remove work file others can see our progress with

    if [[ $WSL_running == true ]]; then  
        # Call lock screen for Windows 10
        rundll32.exe user32.dll,LockWorkStation
    else
        # Call screen saver lock for Ubuntu versions > 14.04.
        dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    fi

    # Reset sound to Laptop or HDMI TV - Uncomment to fix sound device changing
    #    sleep 5 # HDMI deactivates when screen turned off. Give 5 seconds for TV to resync screen.
    #    hotplugtv

done # End of while loop getting minutes to next lock screen

exit 0 # Closed dialog box or "Cancel" selected.

相关内容