[ale] Bash scripting q

JK jknapka at kneuro.net
Thu May 8 22:48:14 EDT 2008


I've already removed the USER variable name from my script.
I actually like the "eval echo $(echo ~$USER)" solution best,
because it uses only shell builtins, therefore no forking.

Thanks everyone for all the alternatives,

-- JK

Jim Kinney wrote:
> #!/bin/bash
> #best to not tinker with USER or HOME variables
> user=$1
> home_dir=$(grep $user /etc/passwd | cut -f 6 -d ":")
> cp foo $home_dir
> chown $user $homedir/foo
>
>
> --OR--
>
> #!/bin/bash
>
> su - $1
> cd ~
> cp <path to foo> .
> exit
>
> On Thu, May 8, 2008 at 3:38 PM, JK <jknapka at kneuro.net 
> <mailto:jknapka at kneuro.net>> wrote:
>
>     Hi folks,
>
>     I am trying to do a very simple thing, and getting screwed by bash's
>     evaluation
>     rules.  Basically, I need to write a script that accepts a user name,
>     and then
>     copies some files to that user's home dir, and also chowns them to
>     that
>     user.
>     So I tried the obvious:
>
>     #!/bin/bash
>     USER=$1
>     cp foo  ~$USER
>     chown $USER ~$USER/foo
>
>     This totally fails to work as I expect, because tilde expansion
>     happens
>     before variable expansion.  So if I supply 'joe' as the first arg,
>     "~$USER"
>     expands to ~joe (instead of the desired /home/joe), and the cp
>     effectively
>     evaluates to "cp foo '~joe'", which ends up creating a regular
>     file named
>     ./~joe
>
>     Is there a clean workaround?  I'd rather not force the user to
>     supply both
>     the user name and the user's home directory as script arguments.  And
>     doing a grep'n'cut on /etc/passwd is not too appealing either.
>      I've checked
>     a couple of books ("bash Cookbook", "Linux Shell Scripting", and an
>     online tutorial or two), but the most any of them say is "Don't do
>     that";
>     they provide no workaround.
>
>     An explicit command to force shell expansion of an arbitrary
>     string would
>     do the trick... I'm goofing around with echo and eval right now, with
>     interesting, but not useful, results...
>
>     Oops, just stumbled on an answer:
>
>      cp foo $(eval echo $(echo ~$USER))
>
>     works, although it makes my eyes water a bit.  Is there a better way?
>     (This post has devolved to the "Linux trivia quiz" level...)
>
>     Thanks,
>
>     -- Joe
>
>     --
>     I do not particularly want to go where the money is -
>      it usually does not smell nice there. -- A. Stepanov
>
>
>     _______________________________________________
>     Ale mailing list
>     Ale at ale.org <mailto:Ale at ale.org>
>     http://mail.ale.org/mailman/listinfo/ale
>
>
>
>
> -- 
> -- 
> James P. Kinney III
> ------------------------------------------------------------------------
>
> _______________________________________________
> Ale mailing list
> Ale at ale.org
> http://mail.ale.org/mailman/listinfo/ale
>   


-- 
I do not particularly want to go where the money is -
 it usually does not smell nice there. -- A. Stepanov



More information about the Ale mailing list