Use o mklink em msys

7

Eu entendo que o Windows mais tarde ou igual a * Vista fornece o comando mklink shell. Eu gostaria de fazer uso disso no terminal Msys. Alguma ideia de como?

Quando eu digito mklink no terminal msys, ele gera sh: mklink: command not found . O Msys fornece apenas um utilitário ln falso que parece ser efetivamente o mesmo que cp .

Eu tentei escrever um shell script para abrir um shell do Windows e executar mklink dentro dele, mas quando meu shell script tenta executar cmd /C <instructions> , o msys traz o shell do Windows para o primeiro plano do terminal atual e o deixa lá , sem executar as instruções.

** Eu não digo 'maior que ou igual a' porque o XP era maior que o Vista mas não tinha mklink utility. *

    
por JellicleCat 13.02.2013 / 20:49

3 respostas

7

Você pode usar links simbólicos nativos do Windows. Para ativar a linha de comentário, com:

MSYS=winsymlinks:nativestrict

no arquivo de início do MSYS2. E execute MSYS2 com privilégios de administrador.

    
por 23.02.2016 / 08:41
6

Usar cmd //c mklink diretamente na linha de comando do MSYS bash deve funcionar.

$ 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.

Nota: O comando mklink e os argumentos precisam ser fornecidos como um único argumento para o cmd. Cite o comando inteiro como assim

cmd //c 'mklink link target'

Note que o comando normalmente seria

cmd  /c 'mklink link target'

que funcionaria no Cygwin e em outros ambientes shell, e até mesmo em uma sessão CMD existente. No entanto, msys parece mangle argumentos de linha de comando (para comandos do Windows), e interpreta /c como um nome de caminho para a raiz do disco C , e converte para c:\ . A digitação de //c foi encontrada para fazer msys passar a opção /c para cmd . Veja Como executar o comando cmd interno do shell msys?

    
por 14.02.2013 / 12:52
3

MSYS=winsymlinks:nativestrict requer que você execute o MSYS2 no modo elevado, Eu realmente não estou confortável com isso.

Este script apenas solicita a elevação do UAC quando invocado, é claro que não será útil para scripts, mas pelo menos isso atende às minhas necessidades:

  • ~ / scripts / sh / 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"
    
  • ~ / scripts / 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
    

O alias ecmd adicional inicia um cmd elevado no diretório atual, pode ser útil às vezes, e também serve como um exemplo de aquisição da elevação do UAC por meio do powershell, se alguém souber escapar dessa coisa corretamente, podemos abandonar esse ajudante WSH.

    
por 25.08.2017 / 12:10