2

I am trying to use a script to find the username and home directory of the user that is currently logged on to a Mac. This is what I have, and it works, but is there a better (i.e. simpler) way to do it?

user=`logname`
userHome="eval echo ~`echo $user`"
userHome=`$userHome`

The script will almost definitely not be run by the logged on user.

This is Mac OS X 10.6, joined to an Active Directory, and a network user is logged on. So the username does not appear in /etc/passwd.

5 Answers 5

3

This script:

#!/bin/bash
w -h | sort -u -t' ' -k1,1 | while read user etc
do
  homedir=$(dscl . -read /Users/$user NFSHomeDirectory | cut -d' ' -f2)
  echo =$user= =$homedir=
done

will do the following:

  • find all users logged in (via ssh too!) w -h or can use the who command too
  • sort and find unique users sort -u -t' ' -k1,1
  • for each logged user
    • read username
    • find his home directory from the DirectoryService daemon via the command dscl
    • print out username and his home directory
1
  • Good old dscl ... don't know why I didn't think of that! Commented Jun 8, 2011 at 20:31
2

The user is stored in a variable USER, and the home is in HOME:

echo user name: $USER, user home: $HOME

This is done automatically. You don't have to write any script to get them.

2
  • This will only tell me the username and home of the user that runs the script. I want the user that is logged on to the GUI, the script is running as a different user. Commented Jun 8, 2011 at 16:06
  • I see. I misunderstood the question.
    – Hai Vu
    Commented Jun 9, 2011 at 15:50
1

From this Advanced Bash-Scripting Guide I learned that

The $(...) form has superseded backticks for command substitution.

The $(...) form of command substitution permits nesting.

Now I am using:

user=$(logname)
userHome=$(eval echo ~$(echo $user))
1
  • That is cleaner than userHome=$(dscl . -read /Users/logname NFSHomeDirectory | awk '{print $2}) ; user=$(basename $userHome) - nicely done
    – bmike
    Commented Jun 8, 2011 at 20:45
0

Assuming logname works, then you can get the home directory like this:

user=$(logname)
userHome=$(awk -F: -v u=$user '$1 == u {print $6}' /etc/passwd)
1
  • The user does not appear in /etc/passwd/. I updated the question. Commented Jun 8, 2011 at 16:38
-2

Not sure if all the other complications are needed.

echo $USER
echo ~
1
  • 1
    From the post "The script will almost definitely not be run by the logged on user." -- your answer won't work to discover other users on the system.
    – Ian C.
    Commented Jun 4, 2015 at 16:46

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .