From: Peter Stephenson <p.stephenson@samsung.com>
To: zsh-workers@zsh.org
Subject: Re: zsh doesn't support standard "unalias -a"
Date: Mon, 18 May 2015 16:30:25 +0100 [thread overview]
Message-ID: <20150518163025.579481a9@pwslap01u.europe.root.pri> (raw)
In-Reply-To: <5559E8F1.6070803@inlv.org>
On Mon, 18 May 2015 14:28:17 +0100
Martijn Dekker <martijn@inlv.org> wrote:
> In a cross-platform shell library I'm writing, I would like to start by
> removing all aliases from the current execution environment, to help
> assure a consistent command language. The standard command to remove all
> aliases is "unalias -a".
This, at least, is easy. It's slightly annoying that we can't pass this
via "unhash -a", unlike the other options, but actually there's no
particular reason ever to use "unhash -a" in preference to unalias.
pws
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 5327789..1b8729d 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -2056,7 +2056,14 @@ the symbolic form the permissions you specify are those which are to be
allowed (not denied) to the users specified.
)
cindex(aliases, removing)
-alias(unalias)(unhash -a)
+item(tt(unalias) [ tt(-ams) ] var(name) ...)(
+Removes aliases. This command works the same as tt(unhash -a), except that
+the tt(-a) option removes all regular or global aliases, or with tt(-s)
+all suffix aliases: in this case no var(name) arguments may appear. The
+options tt(-m) (remove by pattern) and tt(-s) without tt(-a) (remove
+listed suffix aliases) behave as for tt(unhash -a). Note that
+the meaning of tt(-a) is different between tt(unalias) and tt(unhash).
+)
cindex(functions, removing)
alias(unfunction)(unhash -f)
findex(unhash)
diff --git a/Src/builtin.c b/Src/builtin.c
index dbcd022..a9afb45 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -122,9 +122,9 @@ static struct builtin builtins[] =
BUILTIN("type", 0, bin_whence, 0, -1, 0, "ampfsSw", "v"),
BUILTIN("typeset", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%klprtuxmz", NULL),
BUILTIN("umask", 0, bin_umask, 0, 1, 0, "S", NULL),
- BUILTIN("unalias", 0, bin_unhash, 1, -1, 0, "ms", "a"),
- BUILTIN("unfunction", 0, bin_unhash, 1, -1, 0, "m", "f"),
- BUILTIN("unhash", 0, bin_unhash, 1, -1, 0, "adfms", NULL),
+ BUILTIN("unalias", 0, bin_unhash, 0, -1, BIN_UNALIAS, "ams", NULL),
+ BUILTIN("unfunction", 0, bin_unhash, 1, -1, BIN_UNFUNCTION, "m", "f"),
+ BUILTIN("unhash", 0, bin_unhash, 1, -1, BIN_UNHASH, "adfms", NULL),
BUILTIN("unset", BINF_PSPECIAL, bin_unset, 1, -1, 0, "fmv", NULL),
BUILTIN("unsetopt", 0, bin_setopt, 0, -1, BIN_UNSETOPT, NULL, NULL),
BUILTIN("wait", 0, bin_fg, 0, -1, BIN_WAIT, NULL, NULL),
@@ -3557,26 +3557,54 @@ bin_hash(char *name, char **argv, Options ops, UNUSED(int func))
/**/
int
-bin_unhash(char *name, char **argv, Options ops, UNUSED(int func))
+bin_unhash(char *name, char **argv, Options ops, int func)
{
HashTable ht;
HashNode hn, nhn;
Patprog pprog;
- int match = 0, returnval = 0;
+ int match = 0, returnval = 0, all = 0;
int i;
/* Check which hash table we are working with. */
- if (OPT_ISSET(ops,'d'))
+ if (func == BIN_UNALIAS) {
+ if (OPT_ISSET(ops,'s'))
+ ht = sufaliastab; /* suffix aliases */
+ else
+ ht = aliastab; /* aliases */
+ if (OPT_ISSET(ops, 'a')) {
+ if (*argv) {
+ zwarnnam(name, "-a: too many arguments");
+ return 1;
+ }
+ all = 1;
+ } else if (!*argv) {
+ zwarnnam(name, "not enough arguments");
+ return 1;
+ }
+ } else if (OPT_ISSET(ops,'d'))
ht = nameddirtab; /* named directories */
else if (OPT_ISSET(ops,'f'))
ht = shfunctab; /* shell functions */
else if (OPT_ISSET(ops,'s'))
ht = sufaliastab; /* suffix aliases, must precede aliases */
- else if (OPT_ISSET(ops,'a'))
+ else if (func == BIN_UNHASH && (OPT_ISSET(ops,'a')))
ht = aliastab; /* aliases */
else
ht = cmdnamtab; /* external commands */
+ if (all) {
+ queue_signals();
+ for (i = 0; i < ht->hsize; i++) {
+ for (hn = ht->nodes[i]; hn; hn = nhn) {
+ /* record pointer to next, since we may free this one */
+ nhn = hn->next;
+ ht->freenode(ht->removenode(ht, hn->nam));
+ }
+ }
+ unqueue_signals();
+ return 0;
+ }
+
/* With -m option, treat arguments as glob patterns. *
* "unhash -m '*'" is legal, but not recommended. */
if (OPT_ISSET(ops,'m')) {
diff --git a/Src/hashtable.h b/Src/hashtable.h
index 131c15c..b6346bb 100644
--- a/Src/hashtable.h
+++ b/Src/hashtable.h
@@ -59,6 +59,9 @@
#define BIN_ENABLE 25
#define BIN_PRINTF 26
#define BIN_COMMAND 27
+#define BIN_UNHASH 28
+#define BIN_UNALIAS 29
+#define BIN_UNFUNCTION 30
/* These currently depend on being 0 and 1. */
#define BIN_SETOPT 0
diff --git a/Test/A02alias.ztst b/Test/A02alias.ztst
index cace2a4..b294e65 100644
--- a/Test/A02alias.ztst
+++ b/Test/A02alias.ztst
@@ -83,3 +83,13 @@
> a string S
*>*5*echo S a string S "
# Note there is a trailing space on the "> a string S " line
+
+ (
+ unalias -a
+ alias
+ )
+0:unalias -a
+
+ alias -s foo=print
+ unalias -as
+0:unalias -as
prev parent reply other threads:[~2015-05-18 15:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-18 13:28 Martijn Dekker
2015-05-18 15:30 ` Peter Stephenson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150518163025.579481a9@pwslap01u.europe.root.pri \
--to=p.stephenson@samsung.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).