在这个脚本中,〜是/ root /。如何进入/ home / name-of-user /?

时间:2014-07-08 21:46:38

标签: bash shell

#!/bin/bash    

#become root
UID=$(id -u)
if [ x$UID != x0 ] 
then
    printf -v cmd_str '%q ' "$0" "$@"
    exec sudo su -c "$cmd_str"
fi


mkdir ~/.D3GO/; 
cp -a `pwd`/viewright_backup/. ~/.D3GO/;

mkdir /opt/D3GO/;
cp `pwd`/D3GO /opt/D3GO/;
cp `pwd`/D3GO.png /opt/D3GO/;
cp `pwd`/D3GO.desktop /usr/share/applications/;
chmod +x /opt/D3GO/D3GO;

正如您所看到的,因为它使用〜,并且脚本以root身份运行,它会在/ root /目录中创建folder.D3GO。是否可以在主目录中创建它。例如,如果脚本位于/ home / user / Downloads /中,则应在home / user /中创建目录。如果它位于/ home / user2 / Downloads / dir /中,它应该在/ home / user2 /等中创建它。这可能吗?谢谢!

可能是这样的:

#!/bin/bash    

#remember the username
user = $(whoami);

#become root
UID=$(id -u)
if [ x$UID != x0 ] 
then
    printf -v cmd_str '%q ' "$0" "$@"
    exec sudo su -c "$cmd_str"
fi


mkdir /home/`$user`/.D3GO/; 
cp -a `pwd`/viewright_backup/. /home/`$user`/.D3GO/;

2 个答案:

答案 0 :(得分:1)

if [ "$UID" != 0 ] 
then
    printf -v set_home_prefix 'HOME=%q; ' "$HOME"
    printf -v cmd_str '%q ' "$0" "$@"
    exec sudo su -c "$set_home_prefix $cmd_str"
fi

我冒昧地纠正了你在另一个问题上接受的答案中给出的无效引用。

答案 1 :(得分:0)

按字面意思回答你的问题:

sudo -E保留环境变量(尽管新shell可能会覆盖某些变量)。

export MY_HOME=$HOME
. . .

exec sudo -E su -c "$cmd_str"

然后,您可以在脚本中引用$MY_HOME,并将其设置为原始用户$HOME

但我同意@CharlesDuffy的评论,你需要sudo来运行你需要的各个命令。如果这样做,那么sudo命令的参数将从原始shell中替换。

例如:

sudo cp -a `pwd`/viewright_backup/. $HOME/.D3GO/;

这使用非root用户$HOME,因为变量替换发生在sudo命令执行之前。