[ale] Bash scripting q

Geoffrey lists at serioustechnology.com
Thu May 8 16:28:53 EDT 2008


JK 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

I don't do bash, but you might try:

~${USER}

Your example works fine in ksh


> 
> 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
> 


-- 
Until later, Geoffrey

Those who would give up essential Liberty, to purchase a little
temporary Safety, deserve neither Liberty nor Safety.
  - Benjamin Franklin


More information about the Ale mailing list