views:

1935

answers:

4

In my bash script I need to change current dir to user's home directory.

if I want to change to user's foo home dir, from the command line I can do:

cd ~foo

Which works fine, however when I do the same from the script it tells me:

./bar.sh: line 4: cd: ~foo: No such file or directory

Seams like it would be such a trivial thing, but it's not working. What's the problem here? Do I need to escape the "~" or perhaps missing quotes or something else?

Edit

when I say user I don't mean current user that runs the script, but in general any other user on the system

Edit

Here is the script:

#!/bin/bash

user="foo"
cd ~$user

if username is hardcoded like

cd ~foo

it works, but if it is in the user variable then it doesn't. What am I missing here?

+3  A: 

Change it to:

cd $HOME

Actually, I'm not sure why cd ~whatever wouldn't work. I've just tested with a small script and it worked fine:

#!/bin/bash

cd ~sbright

I actually get the same error message that you do when the specified user does not exist on the system. Are you sure (and yes, I know this is one of those is-it-plugged-in questions) that the user exists and has a valid home directory specified?

Edit:

Now that I see what you are actually doing... tilde expansion happens before variable interpolation, which is why you are getting this error.

Sean Bright
When I mean _user_ I don't mean the current user who runs the script, but any OTHER user on the system
Could you post more of your script?
Sean Bright
Yes user exists, I know that simply because same exact thing works from command line
A: 

Is there some reason you can't do:

#!/bin/bash

cd /home/$USER

Of course directories aren't in /home on all *nixes, but assuming you know what OS/distro your script is targeted for, you should be able to come up with something that works well enough.

JSBangs
Thanks for quick answer but this /home/$USER is simply not going to work due to our configuration. Using "~" in my environment is the only feasible way to lookup the user's home.
More generally, while /home is the usual path to home directories, it is not guaranteed. I've seem /u/home and /home/user[1-9]/ and other arrangements.
dmckee
+6  A: 

What about

cd $(getent passwd foo | cut -d: -f6)

and

USER=foo
eval cd ~$USER

works, too (foo is the username)

Johannes Weiß
Thanks! Both methods worked. _eval_ did the trick for me.
the first one (perhaps even with backticks instead of $() ) is more portable since not every shell supports cd ~USER.
Johannes Weiß
A: 

Is the script going to be run by the user? If it is you can just do: cd ~

Mick T
No no, script is run by root user and doing operations on _other_ users.
Bash must be interpreting the tilde and the variable in some way that we don't expect. After a wee bit of trail and error this works: USER=~foo; cd $USER;
Mick T