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.
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. *
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.
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?
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.