msysでmklinkを使用する


10

Windows Vista以降のWindows Vistaはmklinkシェルコマンドを提供することを理解しています。Msysターミナルからこれを利用したいと思います。どのように考えますか?

mklinkmsysターミナルで入力すると、が出力されますsh: mklink: command not found。Msysが提供する偽lnユーティリティは、実質的にと同じように見えますcp

Windowsシェルを開いて実行するシェルスクリプトを記述しようとしましたmklinkが、シェルスクリプトを実行しようとするとcmd /C <instructions>、msysは指示を実行せずにWindowsシェルを現在の端末のフォアグラウンドに移動してそこに残します。

** XPはVistaよりも優れていたが、mklink実用性がなかったため、「以上」とは言いません。*

回答:


10

cmd //c mklinkMSYS 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 リンクターゲット '

これは、Cygwinおよびその他のシェル環境で動作し、既存のCMDセッションでも動作します。ただし、msysは(Windowsコマンドに対する)コマンドライン引数をマングルするよう/cであり、Cディスクのルートへのパス名として解釈し、それをに変換しc:\ます。入力//cすると、msysが/cオプションをに渡すことがわかりましたcmdmsysシェルから内部cmdコマンドを実行する方法を参照してください


入力したコマンドを入力しても同じ結果が得られますが、実際にリンクを作成するために必要な引数を指定するcmd /c mklink <link> <target>と、現在のmsysウィンドウでWindowsシェルが開きます。
JellicleCat

ああ、mklinkコマンドと引数を引用符で囲む必要があります。それに応じて修正された回答。
ak2

2
...そして/c//c代わりに使用して、パラメータをエスケープする必要があります。superuser.com/a/526777/50251を参照してください。
rsenna

それほど慰めではありませんが、makefileでmsysをmklink使用せずに作業しようとしていますが、終わりがありません。cmd / cの動作はほとんど機能しましたが、その後mingw32-makeが使用不能になりました(それ以上の出力はありません)。素晴らしい。これが当てはまる場合、シンボリックリンクを回避する方法を見つけると思います!
エンジニア

7

Windowsネイティブシンボリックリンクを使用できます。有効にするには、次のコマンドで行のコメントを解除します。

MSYS=winsymlinks:nativestrict

MSYS2でbatファイルを開始します。そして、管理者権限でMSYS2を実行します。


1
現在のバージョンでは、Msys2インストールフォルダー(デフォルトではC:\ msys64)の各.iniファイル(msys2,iniなど)の各行のコメントを解除することで、これを設定できます。
TNT

3

MSYS=winsymlinks:nativestrict 昇格モードでMSYS2を実行する必要がありますが、私は実際にはそれを気にしません。

このスクリプトは、呼び出されたときにUACの昇格のみを要求します。もちろん、スクリプトの作成には役立ちませんが、少なくとも私のニーズには合っています。

  • 〜/ 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
    

追加のecmdエイリアスは、現在のディレクトリで昇格されたcmdを起動します。これは便利な場合があります。また、Powershellを介してUAC昇格を取得する例としても役立ちます。


1

Windows 10で、Windows設定で開発者モードを有効にしている限り、管理者として実行する必要なくシンボリックリンクがサポートされるようになりました。

これが完了すると、ホームディレクトリln内の.bashrcファイルの1行で正しく動作するようになります。

export MSYS=winsymlinks:nativestrict

(同等の.iniファイルがGit Bashインストールのどこにあるのかわかりませんでしたが、環境変数を設定してもおそらく機能するでしょう。)

Josh Kelleyによるこの非常に役立つ記事の詳細:https : //www.joshkel.com/2018/01/18/symlinks-in-windows/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.