class IO::Spec::Unix
class IO::Spec::Unix is IO::Spec { }
An object of this type is available via the variable $*SPEC
if the
Raku interpreter is running on a Unix-like platform.
About this class and its related classes also see IO::Spec.
Methods
method abs2rel
method abs2rel(IO::Path:D $path, IO::Path:D $base = $*CWD --> Str:D)
Returns a string that represents $path
, but relative to $base
path. Both $path
and $base
may be relative paths. $base
defaults to $*CWD
.
method basename
method basename(Str:D $path --> Str:D)
Takes a path as a string and returns a possibly-empty portion after the last slash:
IO::Spec::Unix.basename("foo/bar/") .raku.say; # OUTPUT: «""â€Â»
IO::Spec::Unix.basename("foo/bar/.").raku.say; # OUTPUT: «"."â€Â»
IO::Spec::Unix.basename("foo/bar") .raku.say; # OUTPUT: «"bar"â€Â»
method canonpath
method canonpath(Str() $path, :$parent --> Str:D)
Returns a string that is a canonical representation of $path
. If
:$parent
is set to true, will also clean up references to parent
directories. NOTE: the routine does not access the filesystem, so no
symlinks are followed.
IO::Spec::Unix.canonpath("foo//../bar/../ber").say;
# OUTPUT: «foo/../bar/../berâ€Â»
IO::Spec::Unix.canonpath("foo///./../bar/../ber").say;
# OUTPUT: «foo/../bar/../berâ€Â»
IO::Spec::Unix.canonpath("foo///./../bar/../ber", :parent).say;
# OUTPUT: «berâ€Â»
method catdir
method catdir (*@parts --> Str:D)
Concatenates multiple path fragments and returns the canonical
representation of the resultant path as a string. The @parts
are
Str objects and are allowed to contain path separators.
IO::Spec::Unix.catdir(<foo/bar ber raku>).say; # OUTPUT: «foo/bar/ber/rakuâ€Â»
method catfile
Alias for catdir.
method catpath
method catpath ($, Str:D $part1, Str:D $part2 --> Str:D)
Takes two path fragments and concatenates them, adding or removing a path separator, if necessary. The first argument is ignored (it exists to maintain consistent interface with other IO::Spec types for systems that have volumes).
IO::Spec::Unix.catpath($, 'some/dir', 'and/more').say;
# OUTPUT: «some/dir/and/moreâ€Â»
method curdir
method curdir()
Returns a string representing the current directory:
say '.' eq $*SPEC.curdir; # OUTPUT: «Trueâ€Â»
method curupdir
method curupdir()
Returns a Block taking an argument. This block
returns True
if its argument is neither the string representing the
current directory nor the string representing the directory one up from
the current one. It returns False
otherwise.
This block is intended to be used with
smartmatching.
say $*SPEC.curupdir;
# OUTPUT: «-> str $dir { #`(Block|65335808) ... }â€Â»
my @dirs = <. foo .. bar>;
say @dirs.grep: { $_ ~~ $*SPEC.curupdir };
# OUTPUT: «(foo bar)â€Â»
Neither foo
nor bar
are equal to the representation of the current
or parent directory, that is why they are returned by grep
.
Note: Before Rakudo version 2020.06 a none Junction was returned instead of a Block.
method devnull
method devnull(--> Str:D)
Returns the string "/dev/null"
representing the
"Null device":
$*SPEC.devnull.IO.spurt: "foo bar baz";
method dir-sep
method dir-sep(--> Str:D)
Returns the string "/"
representing canonical directory separator
character.
IO::Spec::Unix.dir-sep.say; # OUTPUT: «/â€Â»
method extension
NOTE: Most users would want to use the higher-level routine IO::Path.extension instead of this lower-level version.
method extension(Str:D $path --> Str:D)
Takes a string representing a base name and returns the characters after
the last dot ("."
), or empty string if no dots are present. The
routine makes no attempt to detect path separators and will return
everything after the last dot.
$*SPEC.extension('foo.' ).raku.say; # OUTPUT: «""â€Â»
$*SPEC.extension('foo.txt' ).raku.say; # OUTPUT: «"txt"â€Â»
$*SPEC.extension('foo.tar.gz').raku.say; # OUTPUT: «"gz"â€Â»
$*SPEC.extension('foo' ).raku.say; # OUTPUT: «""â€Â»
$*SPEC.extension('bar.foo/foo').raku.say; # OUTPUT: «"foo/foo"â€Â»
method is-absolute
method is-absolute(Str:D $path --> Bool:D)
Returns True
if the $path
starts with a slash ("/"
), even if it
has combining character on it:
say IO::Spec::Unix.is-absolute: "/foo"; # OUTPUT: «Trueâ€Â»
say IO::Spec::Unix.is-absolute: "/\x[308]foo"; # OUTPUT: «Trueâ€Â»
say IO::Spec::Unix.is-absolute: "bar"; # OUTPUT: «Falseâ€Â»
method join
method join ($, Str:D $dir, Str:D $file --> Str:D)
Similar to catpath, takes two path fragments and
concatenates them, adding or removing a path separator, if necessary,
except it will return just $file
if both $dir
and $file
are
string '/'
or if $dir
is the string '.'
. The first argument is
ignored (it exists to maintain consistent interface with other
IO::Spec types for systems that have volumes).
IO::Spec::Unix.join($, 'foo', 'bar').say; # OUTPUT: «foo/barâ€Â»
IO::Spec::Unix.join($, '/', '/').say; # OUTPUT: «/â€Â»
IO::Spec::Unix.join($, '.', 'foo').say; # OUTPUT: «fooâ€Â»
say $*SPEC.join(True,".","/foo"); # OUTPUT: «/fooâ€Â»
method path
method path(--> Seq:D)
Splits the value of %*ENV<PATH>
on colons (":"
), replaces empty parts with
"."
, and returns a Seq with each of the resultant parts. Returns
an empty Seq if %*ENV<PATH>
is not set or is an empty string.
%*ENV<PATH> = 'foo:bar/ber::foo:';
IO::Spec::Unix.path.raku.say;
# OUTPUT: «("foo", "bar/ber", ".", "foo", ".").Seqâ€Â»
method rel2abs
method rel2abs(Str() $path, $base = $*CWD --> Str:D)
Returns a string representing $path
converted to absolute path, based at
$base
, which defaults to $*CWD
. If $base
is not an absolute path,
it will be made absolute relative to $*CWD
, unless $*CWD
and $base
are the same.
say $*CWD; # OUTPUT: «"/home/camelia".IOâ€Â»
say IO::Spec::Unix.rel2abs: 'foo'; # OUTPUT: «/home/camelia/fooâ€Â»
say IO::Spec::Unix.rel2abs: './'; # OUTPUT: «/home/cameliaâ€Â»
say IO::Spec::Unix.rel2abs: 'foo/../../'; # OUTPUT: «/home/camelia/foo/../..â€Â»
say IO::Spec::Unix.rel2abs: '/foo/'; # OUTPUT: «/fooâ€Â»
say IO::Spec::Unix.rel2abs: 'foo', 'bar'; # OUTPUT: «/home/camelia/bar/fooâ€Â»
say IO::Spec::Unix.rel2abs: './', '/bar'; # OUTPUT: «/barâ€Â»
say IO::Spec::Unix.rel2abs: '/foo/', 'bar'; # OUTPUT: «/fooâ€Â»
say IO::Spec::Unix.rel2abs: 'foo/../../', 'bar';
# OUTPUT: «/home/camelia/bar/foo/../..â€Â»
method rootdir
method rootdir(--> Str:D)
Returns string '/'
, representing root directory.
method split
method split(IO::Spec::Unix: Cool:D $path)
Creates an IO::Path::Parts for $path
,
with an empty string as its volume
attribute's value.
IO::Spec::Unix.split('C:/foo/bar.txt').raku.say;
# OUTPUT: «IO::Path::Parts.new("","C:/foo","bar.txt")â€Â»
IO::Spec::Unix.split('/foo/').raku.say;
# OUTPUT: «IO::Path::Parts.new("","/","foo")â€Â»
IO::Spec::Unix.split('///').raku.say;
# OUTPUT: «IO::Path::Parts.new("","/","/")â€Â»
IO::Spec::Unix.split('./').raku.say;
# OUTPUT: «IO::Path::Parts.new("",".",".")â€Â»
IO::Spec::Unix.split('.').raku.say;
# OUTPUT: «IO::Path::Parts.new("",".",".")â€Â»
IO::Spec::Unix.split('').raku.say;
# OUTPUT: «IO::Path::Parts.new("","","")â€Â»
Note: Before Rakudo version 2020.06 this method split the given
$path
into "volume", "dirname", and "basename" and returned the result
as a List of three Pairs, in that order.
method splitdir
method splitdir(Cool:D $path --> List:D)
Splits the given $path
on slashes.
IO::Spec::Unix.splitdir('C:\foo/bar.txt').raku.say;
# OUTPUT: «("C:\\foo", "bar.txt")â€Â»
IO::Spec::Unix.splitdir('/foo/').raku.say;
# OUTPUT: «("", "foo", "")â€Â»
IO::Spec::Unix.splitdir('///').raku.say;
# OUTPUT: «("", "", "", "")â€Â»
IO::Spec::Unix.splitdir('./').raku.say;
# OUTPUT: «(".", "")â€Â»
IO::Spec::Unix.splitdir('.').raku.say;
# OUTPUT: «(".",)â€Â»
IO::Spec::Unix.splitdir('').raku.say;
# OUTPUT: «("",)â€Â»
method splitpath
method splitpath(Cool:D $path, :$nofile --> List:D)
Splits the given $path
into a list of 3 strings: volume,
dirname, and file. The volume is always an empty string, returned for API
compatibility with other IO::Spec types. If :$nofile
named argument is
set to True
, the content of the file string is undefined and should be
ignored; this is a means to get a performance boost, as implementations may use
faster code path when file is not needed.
IO::Spec::Unix.splitpath('C:\foo/bar.txt').raku.say;
# OUTPUT: «("", "C:\\foo/", "bar.txt")â€Â»
IO::Spec::Unix.splitpath('C:\foo/bar.txt', :nofile).raku.say;
# OUTPUT: «("", "C:\\foo/bar.txt", "")â€Â»
IO::Spec::Unix.splitpath('/foo/').raku.say;
# OUTPUT: «("", "/foo/", "")â€Â»
IO::Spec::Unix.splitpath('/foo/', :nofile).raku.say;
# OUTPUT: «("", "/foo/", "")â€Â»
IO::Spec::Unix.splitpath('///').raku.say;
# OUTPUT: «("", "///", "")â€Â»
IO::Spec::Unix.splitpath('./').raku.say;
# OUTPUT: «("", "./", "")â€Â»
IO::Spec::Unix.splitpath('.').raku.say;
# OUTPUT: «("", "", ".")â€Â»
IO::Spec::Unix.splitpath('').raku.say;
# OUTPUT: «("", "", "")â€Â»
method tmpdir
method tmpdir(--> IO::Path:D)
Attempts to locate a system's temporary directory by checking several typical directories and environment variables. Uses current directory if no suitable directories are found.
method updir
method updir()
Returns a string representing the directory one up from current:
say '..' eq $*SPEC.updir; # OUTPUT: «Trueâ€Â»