src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/mods/unix/umask_test.elvts (about)

     1  //each:eval use unix
     2  
     3  ///////////
     4  # parsing #
     5  ///////////
     6  
     7  ## implicit octal ##
     8  ~> set unix:umask = 23
     9     put $unix:umask
    10  ▶ 0o023
    11  
    12  ## explicit base prefixes ##
    13  ~> set unix:umask = 0o75
    14     put $unix:umask
    15  ▶ 0o075
    16  ~> set unix:umask = 0x43
    17     put $unix:umask
    18  ▶ 0o103
    19  ~> set unix:umask = 0b001010100; put $unix:umask
    20  ▶ 0o124
    21  
    22  ## typed number ##
    23  ~> set unix:umask = (num 0o123)
    24     put $unix:umask
    25  ▶ 0o123
    26  // inexact integers are also supported
    27  ~> set unix:umask = (num 9.0)
    28     put $unix:umask
    29  ▶ 0o011
    30  
    31  ///////////////////////////////
    32  # effect on external commands #
    33  ///////////////////////////////
    34  
    35  // The output of umask is unspecified in POSIX, but all Unix flavors Elvish
    36  // supports write a 0 followed by an octal number. There is one inconsistency
    37  // though: OpenBSD does not zero-pad the number (other than the leading 0), so a
    38  // umask of 0o012 will appear as 012 on OpenBSD but 0012 on other platforms.
    39  // Avoid this by using a umask that is 3 octal digits long.
    40  ~> set unix:umask = 0123; sh -c umask
    41  0123
    42  
    43  ///////////////////
    44  # temp assignment #
    45  ///////////////////
    46  
    47  ~> set unix:umask = 022
    48     { tmp unix:umask = 011; put $unix:umask }
    49     put $unix:umask
    50  ▶ 0o011
    51  ▶ 0o022
    52  
    53  //////////////////
    54  ## parse errors ##
    55  //////////////////
    56  
    57  ## not integer ##
    58  ~> set unix:umask = (num 123.4)
    59  Exception: bad value: umask must be integer in the range [0..0o777], but is 123.4
    60    [tty]:1:5-14: set unix:umask = (num 123.4)
    61  ~> set unix:umask = (num 1/2)
    62  Exception: bad value: umask must be integer in the range [0..0o777], but is 1/2
    63    [tty]:1:5-14: set unix:umask = (num 1/2)
    64  
    65  ## not number ##
    66  ~> set unix:umask = 022z
    67  Exception: bad value: umask must be integer in the range [0..0o777], but is 022z
    68    [tty]:1:5-14: set unix:umask = 022z
    69  
    70  ## invalid type ##
    71  ~> set unix:umask = [1]
    72  Exception: bad value: umask must be integer in the range [0..0o777], but is list
    73    [tty]:1:5-14: set unix:umask = [1]
    74  
    75  ## out of range ##
    76  ~> set unix:umask = 0o1000
    77  Exception: out of range: umask must be from 0 to 0o777, but is 0o1000
    78    [tty]:1:5-14: set unix:umask = 0o1000
    79  ~> set unix:umask = -1
    80  Exception: out of range: umask must be from 0 to 0o777, but is -0o1
    81    [tty]:1:5-14: set unix:umask = -1
    82  ~> set unix:umask = (num 100000000000000000000)
    83  Exception: out of range: umask must be from 0 to 0o777, but is 100000000000000000000
    84    [tty]:1:5-14: set unix:umask = (num 100000000000000000000)