我按照中的说明进行操作https://stackoverflow.com/questions/2135644/how-can-i-define-a-bash-alias-as-a-sequence-of-multiple-commands创建我自己的 bash 脚本。如下:
sudo -u otheruser -i
alias cd1="cd /dir/one/"
alias cd2="cd /dir/two/"
我希望这些别名可供使用otheruser
。我的目标是将其作为可执行文件运行,但为了测试我正在采购它(以避免出现问题https://stackoverflow.com/questions/2197461/how-to-set-an-alias-inside-a-bash-shell-script-so-that-is-it-visible-from-the-ou) 喜欢source ./myscript
。
即使这样做, sudo 也可以工作,但以下别名均不可用(对于otheruser
)。您认为别名是否应用于调用此命令的用户,而不是新用户?或者是否存在某些规则,在 sudo 到另一个用户后会忽略脚本中的命令?
答案1
我认为它不起作用的原因是这两个alias
命令是bash
在会话启动sudo
完成后运行的。您可以进行测试 - 获取脚本源,当新会话开始时按
Ctrl-d保留它,然后在原始 shell 中输入:
$ type cd1
cd1 is aliased to `cd /dir/one/'
$ type cd2
cd2 is aliased to `cd /dir/two/'
我可以实现你想要的expect
脚本,但我不是这方面的专家,所以欢迎批评:
#!/usr/bin/expect -f
spawn sudo -u otheruser -i
send "alias cd1='cd /dir/one/'"
send "\n"
send "alias cd2='cd /dir/two/'"
send "\n"
interact
expect
在运行此脚本之前确保您确实已经安装。
您也许能够使用系统的包管理器进行安装(这是必需的)expect
。tcl
如果您需要手动安装,请参阅 Expect 的说明:http://expect.sourceforge.net/。 Expect 的 README/INSTALL 文件指出了一些获取 Tcl 的位置,但这些似乎已经过时了。不过,您可以从 ActiveState 获取 Tcl 的副本。