Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在这个脚本中,~is/root/。如何进入/主页/用户名/?_Bash_Shell - Fatal编程技术网

Bash 在这个脚本中,~is/root/。如何进入/主页/用户名/?

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 ]

如您所见,因为它使用~,并且脚本以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 ] 
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/;