github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/cmds/core/readlink/readlink.go (about) 1 // Copyright 2013-2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // readlink display value of symbolic link file. 6 // 7 // Synopsis: 8 // readlink [OPTIONS] FILE 9 // 10 // Options: 11 // -f: follow 12 // -n: nonewline 13 // -v: verbose 14 package main 15 16 import ( 17 "flag" 18 "fmt" 19 "os" 20 "path/filepath" 21 ) 22 23 const cmd = "readlink [-fnv] FILE" 24 25 var ( 26 delimiter = "\n" 27 follow = flag.Bool("f", false, "follow recursively") 28 nonewline = flag.Bool("n", false, "do not output trailing newline") 29 verbose = flag.Bool("v", false, "report error messages") 30 ) 31 32 func init() { 33 defUsage := flag.Usage 34 flag.Usage = func() { 35 os.Args[0] = cmd 36 defUsage() 37 } 38 } 39 40 func readLink(file string) error { 41 path, err := os.Readlink(file) 42 if err != nil { 43 return err 44 } 45 46 if *follow { 47 path, err = filepath.EvalSymlinks(file) 48 } 49 50 if *nonewline { 51 delimiter = "" 52 } 53 54 fmt.Printf("%s%s", path, delimiter) 55 return err 56 } 57 58 func main() { 59 flag.Parse() 60 61 var exitStatus int 62 63 for _, file := range flag.Args() { 64 if err := readLink(file); err != nil { 65 if *verbose { 66 fmt.Fprintf(os.Stderr, "%v\n", err) 67 } 68 exitStatus = 1 69 } 70 } 71 72 os.Exit(exitStatus) 73 }