kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -29- <Args,Lchown>

こんにちは、kurumi-bioです。
第13回目のosパッケージ(標準ライブラリー)の学習です。

環境

  • Windows
    OSバージョン:Windows11 Home 22H2
    Go言語のバージョン:go version go1.20 windows/amd64
  • Linux
    OSバージョン:openSUSE Leap 15.4
    Go言語のバージョン:go version go1.20.1 linux/amd64

Args変数

var Args []string

変数の説明Args は、プログラム名で始まるコマンドライン引数を保持します。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    for i, v := range os.Args {
        fmt.Printf("Args[%d]=%s\n", i, v)
    }
}

コードの説明 os.Args変数の値をすべて表示します。

◆実行結果(Windows)

実行結果の説明go buildコマンドでEXEモジュールを作成してから実行しました。
コマンドに引数を3つ渡して実行した結果os.Args変数の値は、 コマンドパス、1つ目の引数、2つ目の引数、3つ目の引数になりました。

Lchown関数

func Lchown(name string, uid, gid int) error

関数の説明 Lchown は、指定されたファイルの数値 uid と gid を変更します。ファイルがシンボリック リンクの場合、リンク自体の uid と gid が変更されます。エラーがある場合、タイプは *PathError になります。

Windows では、*PathError でラップされた syscall.EWINDOWS エラーが常に返されます。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintln(os.Stderr, "ファイルを指定してください")
        os.Exit(1)
    }

    fn := os.Args[1]
    e := os.Lchown(fn, 1001, 1000)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Lchown", e))
        os.Exit(1)
    } else {
        fmt.Printf("ファイル[%s]のuidとgidを変更しました。\n", fn)
    }
}

コードの説明 os.Lchown()関数を使って、コマンド実行時に指定したファイルのuidを1001、gidを1000に変更します。

◆実行結果(Windows)

実行結果の説明関数の説明通りnot supoprted by windowsのエラーになりました。

◆実行結果(Linux)

普通のファイルとハードリンクとシンボリックリンクの3種類のファイルに対して、uidとgidを変更します。

statコマンドを使って、test-hファイルとhardlinkファイルは同一ファイル(ハードリンク)であることを確認

symboliclinkファイルは、test-sファイルのシンボリックリンクであること。
全てのファイルは、uidがkurumiでgidがuserであること。
を確認。

uid:1001は、goというユーザーであること。
gid:1000は、go-userというグループであること。
を確認

testファイルのuidとgidを変更

hardlinkファイルのuidとgidを変更。リンク先のtest-hファイルもuidとgidが変更されています。

symboliclinkファイルのuidとgidを変更。リンク先のtest-sファイルはuidとgidは変更されませんでした。

実行結果の説明 uidとgidが指定したものに変わっていることが確認できました。 ハードリンクは、リンク先も変わっていることが確認できました。 シンボリックリンクは、リンク先は変化がなく、リンクファイルだけuidとgidが変わることが確認できました。

最後までご覧いただきありがとうございます