Используйте mklink в msys
Я понимаю, что 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 ответа
Windows 10 теперь поддерживает символические ссылки без необходимости запуска от имени администратора, если вы включаете режим разработчика в настройках Windows.
Как только это будет сделано, вы можете получить ln
работает правильно с одной строкой в .bashrc
файл в вашем домашнем каталоге!
export MSYS=winsymlinks:nativestrict
(Я не смог выяснить, где находится эквивалентный файл.ini в моей установке Git Bash. Но установка переменной окружения там, вероятно, тоже подойдет.)
Более подробная информация в этой очень полезной статье Джоша Келли: https://www.joshkel.com/2018/01/18/symlinks-in-windows/
С помощью 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:\
, Typing //c
было установлено, что MSYS передать /c
возможность cmd
, См. Как запустить внутреннюю команду cmd из оболочки msys?
Вы можете использовать родные символические ссылки Windows. Для включения раскомментируйте строку с:
MSYS=winsymlinks:nativestrict
в MSYS2 запускается файл bat. И запустить MSYS2 с правами администратора.
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-помощника.