Bash 在这个脚本中,~is/root/。如何进入/主页/用户名/?
如您所见,因为它使用~,并且脚本以root身份运行,所以它在/root/目录中创建了folder.D3GO。是否可以在主目录中创建它。例如,如果脚本位于/home/user/Downloads/,它应该在home/user/中创建目录。如果它位于/home/user2/Downloads/dir/,它应该在/home/user2/等中创建它。这可能吗?谢谢 可能是这样的:Bash 在这个脚本中,~is/root/。如何进入/主页/用户名/?,bash,shell,Bash,Shell,如您所见,因为它使用~,并且脚本以root身份运行,所以它在/root/目录中创建了folder.D3GO。是否可以在主目录中创建它。例如,如果脚本位于/home/user/Downloads/,它应该在home/user/中创建目录。如果它位于/home/user2/Downloads/dir/,它应该在/home/user2/等中创建它。这可能吗?谢谢 可能是这样的: #!/bin/bash #become root UID=$(id -u) if [ x$UID != x0 ]
#!/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;
我冒昧地更正了您在另一个问题上接受的答案中给出的无效引用。按照字面意思回答您的问题:
sudo-E
保留环境变量(尽管新shell可能会覆盖某些变量)
然后您可以在脚本中引用$MY_HOME
,它应该设置为原始用户的$HOME
但是我同意@CharlesDuffy的评论,对于需要运行的单个命令,您应该sudo
。如果这样做,那么sudo
命令的参数将从原始shell中替换
例如:
export MY_HOME=$HOME
. . .
exec sudo -E su -c "$cmd_str"
这使用非root用户的
$HOME
,因为变量替换发生在执行sudo
命令之前 为什么要使用su
安装到当前用户的主目录中?因为我还需要访问/usr/share/applications/,所以您应该升级到root,只针对写入/usr/share/applications
的安装部分,而不是所有安装部分。否则,您将在用户的主目录中创建他们没有写入权限的文件——这是一种让愤怒的用户生气的好方法。顺便说一句,sudo su
通常是不好的做法sudo
可以做任何事情su
can,因此您不需要同时使用这两种功能;sudo-su
的大多数用法可以替换为sudo-i
。如果使用$user,则不必使用``。只需说/home/$user/.D3GO-我还建议使用$user设置用户变量…或sudo MY_home=“$home”…
,它显式导出特定变量。@CharlesDuffy,是的,很好,他可能不想导出所有环境变量。
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
export MY_HOME=$HOME
. . .
exec sudo -E su -c "$cmd_str"
sudo cp -a `pwd`/viewright_backup/. $HOME/.D3GO/;