gitee.com/mirrors_u-root/u-root@v7.0.0+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  }