bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possible Feature Requests (unsource, exchange)


From: Christopher Roy Bratusek
Subject: Re: Possible Feature Requests (unsource, exchange)
Date: Wed, 8 Jul 2009 20:01:58 +0200

Am Tue, 7 Jul 2009 14:37:20 -0400
schrieb Greg Wooledge <wooledg@eeg.ccf.org>:

> On Tue, Jul 07, 2009 at 08:16:50PM +0200, Christopher Roy Bratusek
> wrote:
> > unsource: the opposite of source (while source is making functions
> > publically available, unsource would remove them) 
> 
> You can "unset -f" a function.  You could source a script-file that
> contains a bunch of "unset -f foo" commands.
> 
> If what you want is "parse the bash commands in a script-file and do
> the opposite of every one that sets a variable", that's probably
> impossible.
> 

O.K. not that important.

> 
> > exchange: exchanges the value of two variables (x=2 y=a; exchange x
> > y; x=a y=2 -- need to be exported, so $1 $2 inside a
> > function/script don't help that much)
> 
> A function would not impair you here.  Functions are executed in the
> same process as the caller, as long as you don't do anything else
> that would create a subshell.
> 
> # Usage: exchange varname1 varname2
> exchange() {
>    local tmp
>    [[ $1 = *[^[:alnum:]_]* || $1 = [0-9]* ]] &&
>      { echo "Naughty naughty" >&2; return 1; }
>    [[ $2 = *[^[:alnum:]_]* || $2 = [0-9]* ]] &&
>      { echo "Naughty naughty" >&2; return 1; }
>    eval tmp=\$$1
>    eval $1=\$$2
>    eval $2=\$tmp
>    return 0
> }
> 

Great.

> Note: while I did test this, and while I did intend it to be safe, you
> should double-check it yourself before relying on it.  Eval is a very
> sharp knife.
> 

Me too, did not found anything wrong. Mind, if I'm going to include
this in my software? Would have to be GPL v3 though. (CREDITS of course
will go to you).

> 
> > echo no-expand: if you do echo $@ ($@ is $x $y for example) echo
> > will print the values of $x $y instead of simply $x and $y is there
> > a way to achieve this?
> 
> Quoting error.  If you want to print the contents of the string
> consisting of all the positional parameters with a single space in
> between each pair, then use one of these:
> 
> echo "$*"
> echo "$@"
> printf "%s\n" "$*"           # pretty safe; but still IFS-sensitive
> x="$@"; printf "%s\n" "$x"   # I think this one's totally safe....
> 
> Or with a single space after each one and then a trailing newline:
> 
> print "%s " "$@"; echo       # very safe but has extra trailing space
> 
> Also, your original statement of the problem was wrong:
> 
> imadev:~$ set -- '$x' '$y'; x=1 y=2
> imadev:~$ echo $@
> $x $y
> 
> I think your actual problem was that you had globbing characters in
> the positional parameters, not dollar signs:
> 
> imadev:~$ set -- 'foo*' '$y'; x=1 y=2
> imadev:~$ echo $@
> foo foo1 foo-s foo.c foo.conf foo.cpp foo.gif foo.ini foo.m4 foo.new
> foo.pl foo.sh foo.tar.gz foo.tcl $y
> 
> If you insist on not quoting things (a practice which I would not
> recommend you pick up unless it's absolutely required for a particular
> script), then you can use "set -f" to suppress the glob expansion.
> 

Thanks for your help,
Chris





reply via email to

[Prev in Thread] Current Thread [Next in Thread]