创建目录权限

如果你想创建一个目录并授予777权限,你需要怎么做?查看Go的API文档我们可以这样写。

源文件为mkdir.go。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. err := os.MkdirAll("/tmp/gotest/", 0777)
  8. if err != nil {
  9. panic(err)
  10. }
  11. fmt.Println("Mkdir /tmp/gotest/")
  12. }

运行结果

  1. understand_linux_process_examples git:(master) ll /tmp/
  2. drwxr-xr-x 2 tobe wheel 68B Dec 30 10:06 gotest
  3. understand_linux_process_examples git:(master) umask
  4. 022

正确做法

代码在mkdir_umask.go中。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "syscall"
  6. )
  7. func main() {
  8. mask := syscall.Umask(0)
  9. defer syscall.Umask(mask)
  10. err := os.MkdirAll("/tmp/gotest/", 0777)
  11. if err != nil {
  12. panic(err)
  13. }
  14. fmt.Println("Mkdir /tmp/gotest/")
  15. }

注意事项

这并不是Go的Bug,包括Linux系统调用都是这样的,创建目录除了给定的权限还要加上系统的Umask,Go也是如实遵循这种约定。

如果你想达到你的预期权限,知道Umask及其用法是必须的。