Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
oh-my-zsh
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
github
oh-my-zsh
Commits
a952854c
Commit
a952854c
authored
Dec 26, 2019
by
Marc Cornellà
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gnu-utils: add README, simplify plugin
parent
59930902
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
103 additions
and
65 deletions
+103
-65
README.md
plugins/gnu-utils/README.md
+38
-0
gnu-utils.plugin.zsh
plugins/gnu-utils/gnu-utils.plugin.zsh
+65
-65
No files found.
plugins/gnu-utils/README.md
0 → 100644
View file @
a952854c
# gnu-utils plugin
This plugin binds GNU coreutils to their default names, so that you don't have
to call them using their prefixed name, which starts with
`g`
. This is useful
in systems which don't have GNU coreutils installed by default, mainly macOS
or FreeBSD, which use BSD coreutils.
To use it, add
`gnu-utils`
to the plugins array in your zshrc file:
```
zsh
plugins
=(
... gnu-utils
)
```
The plugin works by changing the path that the command hash points to, so
instead of
`ls`
pointing to
`/bin/ls`
, it points to wherever
`gls`
is
installed.
Since
`hash -rf`
or
`rehash`
refreshes the command hashes, it also wraps
`hash`
and
`rehash`
so that the coreutils binding is always done again
after calling these two commands.
Look at the source code of the plugin to see which GNU coreutils are tried
to rebind. Open an issue if there are some missing.
## Other methods
The plugin also documents two other ways to do this:
1.
Using a function wrapper, such that, for example, there exists a function
named
`ls`
which calls
`gls`
instead. Since functions have a higher preference
than commands, this ends up calling the GNU coreutil. It has also a higher
preference over shell builtins (
`gecho`
is called instead of the builtin
`echo`
).
2.
Using an alias. This has an even higher preference than functions, but they
could be overridden because of a user setting.
## Author
-
[
Sorin Ionescu
](
https://github.com/sorin-ionescu
)
.
plugins/gnu-utils/gnu-utils.plugin.zsh
View file @
a952854c
...
...
@@ -5,79 +5,79 @@
# VERSION: 1.0.0
# ------------------------------------------------------------------------------
# Detect if GNU coreutils are installed by looking for gwhoami
if
[[
!
-x
"
${
commands
[gwhoami]
}
"
]]
;
then
return
fi
if
[[
-x
"
${
commands
[gwhoami]
}
"
]]
;
then
__gnu_utils
()
{
emulate
-L
zsh
local
gcmds
local
gcmd
local
cmd
local
prefix
__gnu_utils
()
{
emulate
-L
zsh
local
gcmds
local
gcmd
local
cmd
local
prefix
# coreutils
gcmds
=(
'g['
'gbase64'
'gbasename'
'gcat'
'gchcon'
'gchgrp'
'gchmod'
'gchown'
'gchroot'
'gcksum'
'gcomm'
'gcp'
'gcsplit'
'gcut'
'gdate'
'gdd'
'gdf'
'gdir'
'gdircolors'
'gdirname'
'gdu'
'gecho'
'genv'
'gexpand'
'gexpr'
'gfactor'
'gfalse'
'gfmt'
'gfold'
'ggroups'
'ghead'
'ghostid'
'gid'
'ginstall'
'gjoin'
'gkill'
'glink'
'gln'
'glogname'
'gls'
'gmd5sum'
'gmkdir'
'gmkfifo'
'gmknod'
'gmktemp'
'gmv'
'gnice'
'gnl'
'gnohup'
'gnproc'
'god'
'gpaste'
'gpathchk'
'gpinky'
'gpr'
'gprintenv'
'gprintf'
'gptx'
'gpwd'
'greadlink'
'grm'
'grmdir'
'gruncon'
'gseq'
'gsha1sum'
'gsha224sum'
'gsha256sum'
'gsha384sum'
'gsha512sum'
'gshred'
'gshuf'
'gsleep'
'gsort'
'gsplit'
'gstat'
'gstty'
'gsum'
'gsync'
'gtac'
'gtail'
'gtee'
'gtest'
'gtimeout'
'gtouch'
'gtr'
'gtrue'
'gtruncate'
'gtsort'
'gtty'
'guname'
'gunexpand'
'guniq'
'gunlink'
'guptime'
'gusers'
'gvdir'
'gwc'
'gwho'
'gwhoami'
'gyes'
)
# coreutils
gcmds
=(
'g['
'gbase64'
'gbasename'
'gcat'
'gchcon'
'gchgrp'
'gchmod'
'gchown'
'gchroot'
'gcksum'
'gcomm'
'gcp'
'gcsplit'
'gcut'
'gdate'
'gdd'
'gdf'
'gdir'
'gdircolors'
'gdirname'
'gdu'
'gecho'
'genv'
'gexpand'
'gexpr'
'gfactor'
'gfalse'
'gfmt'
'gfold'
'ggroups'
'ghead'
'ghostid'
'gid'
'ginstall'
'gjoin'
'gkill'
'glink'
'gln'
'glogname'
'gls'
'gmd5sum'
'gmkdir'
'gmkfifo'
'gmknod'
'gmktemp'
'gmv'
'gnice'
'gnl'
'gnohup'
'gnproc'
'god'
'gpaste'
'gpathchk'
'gpinky'
'gpr'
'gprintenv'
'gprintf'
'gptx'
'gpwd'
'greadlink'
'grm'
'grmdir'
'gruncon'
'gseq'
'gsha1sum'
'gsha224sum'
'gsha256sum'
'gsha384sum'
'gsha512sum'
'gshred'
'gshuf'
'gsleep'
'gsort'
'gsplit'
'gstat'
'gstty'
'gsum'
'gsync'
'gtac'
'gtail'
'gtee'
'gtest'
'gtimeout'
'gtouch'
'gtr'
'gtrue'
'gtruncate'
'gtsort'
'gtty'
'guname'
'gunexpand'
'guniq'
'gunlink'
'guptime'
'gusers'
'gvdir'
'gwc'
'gwho'
'gwhoami'
'gyes'
)
# findutils
gcmds+
=(
'gfind'
'gxargs'
'glocate'
)
# findutils
gcmds+
=(
'gfind'
'gxargs'
'glocate'
)
# Not part of either coreutils or findutils, installed separately.
gcmds+
=(
'gsed'
'gtar'
'gtime'
)
# Not part of either coreutils or findutils, installed separately.
gcmds+
=(
'gsed'
'gtar'
'gtime'
)
for
gcmd
in
"
${
gcmds
[@]
}
"
;
do
#
# This method allows for builtin commands to be primary but it's
# lost if hash -r or rehash -f is executed. Thus, those two
# functions have to be wrapped.
#
((
${
+commands[
$gcmd
]
}
))
&&
hash
${
gcmd
[2,-1]
}
=
${
commands
[
$gcmd
]
}
for
gcmd
in
"
${
gcmds
[@]
}
"
;
do
# Do nothing if the command isn't found
((
${
+commands[
$gcmd
]
}
))
||
continue
# This method allows for builtin commands to be primary but it's
# lost if hash -r or rehash -f is executed. Thus, those two
# functions have to be wrapped.
#
hash
${
gcmd
[2,-1]
}
=
${
commands
[
$gcmd
]
}
#
# This method generates wrapper functions.
# It will override shell builtins.
#
# (( ${+commands[$gcmd]} )) && \
# eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
# This method generates wrapper functions.
# It will override shell builtins.
#
# eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
#
# This method is inflexible since the aliases are at risk of being
# overridden resulting in the BSD coreutils being called.
#
# (( ${+commands[$gcmd]} )) && \
# alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
done
# This method is inflexible since the aliases are at risk of being
# overridden resulting in the BSD coreutils being called.
#
# alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
done
return
0
}
__gnu_utils
;
return
0
}
__gnu_utils
function
hash
()
{
if
[[
"
$*
"
=
~
"-(r|f)"
]]
;
then
builtin hash
"
$@
"
__gnu_utils
else
builtin hash
"
$@
"
fi
}
function
hash
()
{
if
[[
"
$*
"
=
~
"-(r|f)"
]]
;
then
builtin hash
"
$@
"
__gnu_utils
else
builtin hash
"
$@
"
fi
}
function
rehash
()
{
if
[[
"
$*
"
=
~
"-f"
]]
;
then
builtin
rehash
"
$@
"
__gnu_utils
else
builtin
rehash
"
$@
"
fi
}
fi
function
rehash
()
{
if
[[
"
$*
"
=
~
"-f"
]]
;
then
builtin
rehash
"
$@
"
__gnu_utils
else
builtin
rehash
"
$@
"
fi
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment