我正在使用 /etc/host 将 localhost 映射到 Web 域。我想要一种快速的方法来做到这一点,而不是每次都搜索和替换。我把它放在我的 .bashrc 文件中。
alias hostchange='
nowdir=$PWD;
cd /etc;
mv hosts hoststempname;
mv hostssecondary hosts;
mv hoststempname hostssecondary;
cd $nowdir'
我收到此错误,无论 y 或 n 都不会进展。
mv: rename hosts to hoststempname: Permission denied
override rw-r--r-- root/wheel for hosts? (y/n [n])
我通过添加 sudo 让它工作。
alias hostchange='
nowdir=$PWD;
cd /etc;
sudo mv hosts hoststempname;
sudo mv hostssecondary hosts;
sudo mv hoststempname hostssecondary;
cd $nowdir'
这是合法的吗?我是在黑暗中开枪吗?
答案1
你走在正确的轨道上!对此有一些评论。通常更好的做法是将这样的多行操作留给函数。我可能会这样写:
change_etc_hosts_file() {
set -e # stop running if we encounter an error
sudo \mv -f /etc/hosts /etc/hoststempname
sudo \mv -f /etc/hostssecondary /etc/hosts
sudo \mv -f /etc/hoststempname /etc/hostssecondary
set +e
}
alias changehosts=change_etc_hosts_file
您会注意到我还使用了绝对路径而不是更改目录。这通常是一个更好的主意(使用绝对路径)。如果您确实想继续使用亲戚,那么通常最好在子 shell 中执行此操作,这样您就不必处理将目录更改回 $PWD (如果您中止,将使您处于奇怪的状态)。要将其作为子 shell 执行,它将如下所示:
change_etc_hosts_file() {
( # use subshell
cd /etc
set -e # stop running if we encounter an error
sudo \rm -f hoststempname # the \ escapes aliases which might cause prompting
sudo \cp -f hosts hoststempname
sudo \cp -f hostssecondary hosts
sudo \cp -f hoststempname hostssecondary
)
}
cd 发生在 () 内,这是一个新进程,因此它不会影响您当前的工作目录。
答案2
你对这个命令有疑问的事实sudo
表明,不知怎的,你在 Unix 世界中生存至今,却没有掌握有关 unix 用户概念的基本知识(根尤其)。虽然这种情况对我来说是不可理解的,但你的问题和评论清楚地表明了情况就是如此。
是的,你所取得的成果sudo
正是你所期望的。这是因为:
- 在 Unix 系统上,有许多系统用户- 你可以称它们为“虚拟”(这些是不是被误认为是人类计算机用户)。
- 每个文件和目录都有它的所有者,它始终是(虚拟)用户之一。
- 这根用户,称为超级用户是每个 Unix 都必须拥有的特殊系统帐户。他可以做任何事情——拥有系统的全部权力。
sudo
是一个用于临时利用“普通”用户权限的命令根以便可以执行一些特殊任务。