[ale] Bash scripting q

JK jknapka at kneuro.net
Thu May 8 15:38:38 EDT 2008


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




More information about the Ale mailing list