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