8

Я понимаю, что Windows, более поздняя, чем * Vista, предоставляет команду оболочки mklink . Я хотел бы использовать это из терминала Msys. Есть идеи как?

Когда я ввожу mklink на терминал msys, он выводит sh: mklink: command not found . Msys предоставляет только поддельную утилиту ln которая, по-видимому, практически не отличается от cp .

Я попытался написать сценарий оболочки, чтобы открыть оболочку Windows и запустить в ней mklink , но когда мой сценарий оболочки пытается выполнить cmd /C <instructions> , msys выводит оболочку Windows на передний план текущего терминала и оставляет ее там без запустить инструкции.

** Я не говорю «больше, чем или равно», потому что XP была выше, чем Vista, но не имела утилиты mklink .*

4 ответа4

7

Использование cmd //c mklink непосредственно в командной строке MSYS bash должно работать.

$ cmd //c mklink
Creates a symbolic link.

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

Примечание. Команду и аргументы mklink необходимо указывать в качестве одного аргумента для cmd. Цитировать всю команду так

cmd //c 'mklink link target'

Обратите внимание, что команда обычно

cmd  /c 'mklink link target'

который будет работать в Cygwin и других средах оболочки, и даже в существующем сеансе CMD.  Однако msys, похоже, искажает аргументы командной строки (для команд Windows), и интерпретирует /c как путь к корню диска C и преобразует его в c:\ .  Обнаружено, что при вводе //c msys передает параметр /c в cmd .  Смотрите Как запустить внутреннюю команду cmd из оболочки msys?

7

Вы можете использовать родные символические ссылки Windows. Чтобы включить его, раскомментируйте строку с:

MSYS=winsymlinks:nativestrict

в MSYS2 запускается файл bat. И запустить MSYS2 с правами администратора.

3

MSYS=winsymlinks:nativestrict требует от вас запуска MSYS2 в режиме повышенных прав, мне это не очень удобно.

Этот сценарий запрашивает повышение прав UAC только при вызове, конечно, тогда он не будет полезен для сценариев, но по крайней мере он удовлетворяет моим потребностям:

  • ~/ Скрипты / ш / msys2-ln.sh:

    #!/bin/sh
    if [ "$#" -eq 2 -a "$1" == "-s" ]; then
        TARGET="$2"
        LINK=$(basename "$TARGET")
    elif [ "$#" -eq 3 -a "$1" == "-s" ]; then
        TARGET="$2"
        LINK="$3"
    else
        echo "this weak implementation only supports \`ln -s\`"
        exit
    fi
    
    if [ -d "$TARGET" ]; then
        MKLINK_OPTS="//d"
    fi
    
    TARGET=$(cygpath -w -a "$TARGET")
    LINK=$(cygpath -w -a "$LINK")
    
    echo "$TARGET"
    echo "$LINK"
    cscript //nologo ~/scripts/wsh/run-elevated.js \
        cmd //c mklink $MKLINK_OPTS "$LINK" "$TARGET"
    
  • ~/ скрипты / WSH / Run-elevated.js

    var args = WScript.Arguments;
    if(args.length == 0){
        WScript.Echo("nothing to run");
        WScript.Quit(0);
    }
    
    var quoted_args = [];
    for(var i = 1; i < args.length; ++i){
        var arg = args(i); // it's a callable, not array like
        if(arg.indexOf(" ") != -1){
            arg = "\"" + arg + "\"";
        }
        quoted_args.push(arg);
    }
    
    var SHAPP = WScript.CreateObject("shell.application");
    SHAPP.ShellExecute(args(0), quoted_args.join(" "), "", "runas", 1);
    
  • ~/ .Bashrc

    # workaround for MSYS2's awkward ln
    if [ $- == *i* -a ! -z $MSYSTEM ]; then
        alias ln='~/scripts/sh/msys2-ln.sh'
        alias ecmd='powershell "start-process cmd.exe \"/k cd /d $(pwd -W)\" -verb runas"'
    fi
    

Дополнительный псевдоним ecmd запускает cmd с повышенными правами в текущем каталоге, иногда это может быть полезно, и он также служит примером получения повышения UAC с помощью powershell. Если кто-то знает, как избежать этого, мы можем отказаться от этого помощника WSH.

1

Windows 10 теперь поддерживает символические ссылки без необходимости запуска с правами администратора, если вы включаете режим разработчика в настройках Windows.

Как только это будет сделано, вы можете получить ln правильно работать с одной строкой в файле .bashrc в вашем домашнем каталоге!

export MSYS=winsymlinks:nativestrict

(Я не смог выяснить, где находится эквивалентный файл .ini в моей установке Git Bash. Но установка переменной окружения там, вероятно, тоже сработает.)

Более подробная информация в этой очень полезной статье Джоша Келли:https://www.joshkel.com/2018/01/18/symlinks-in-windows/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .