【发布时间】:2016-04-11 12:11:22
【问题描述】:
如何使~/.config/fish/config.fish 中定义的别名和~/.config/fish/functions 中定义的函数也可用于root 用户?
符号链接到/root/.config/fish 没有完成这项工作。此外,我还希望能够通过sudo 使用我的函数和别名,目前还不能正常工作。
你们是怎么做到的?
【问题讨论】:
标签: fish
如何使~/.config/fish/config.fish 中定义的别名和~/.config/fish/functions 中定义的函数也可用于root 用户?
符号链接到/root/.config/fish 没有完成这项工作。此外,我还希望能够通过sudo 使用我的函数和别名,目前还不能正常工作。
你们是怎么做到的?
【问题讨论】:
标签: fish
我没有第一个问题的解决方案(我没有任何对 root 用户有用的函数),但可以解决第二个问题(函数不能作为sudo 的参数)带有包装函数:
function sudo
if functions -q $argv[1]
set argv fish -c "$argv"
end
command sudo $argv
end
问题当然是sudo 是一个外部命令(通常位于 /usr/bin/sudo),它无法了解诸如函数定义之类的鱼内部结构。所以如果你给它一个函数名,这个包装器将调用fish。当然,由于这会启动一个新的鱼会话,因此某些内容(例如 cd)将无用,因为它不会改变鱼主会话的状态。
【讨论】:
ls 也是一个函数。如果我运行sudo ls "My File",它将分别查找名为My 和File 的文件。
我对我的 config.fish 使用了符号链接,并且运行良好。你检查权限了吗?
777 lrwxrwxrwx 1 root root 35 Dez 21 2015 /root/.config/fish/config.fish -> /home/lara/.config/fish/config.fish
在较新的版本中,您还可以使用目录 /etc/fish/ 进行系统范围的配置
我用别名解决了 sudo 的问题:
# -E just preserv env. It's not really
# necessary, but may be useful.
function sudo; command sudo -sE $argv; end
来自 sudo 手册页:
-s, --shell 运行由 SHELL 环境变量指定的 shell(如果已设置)或由调用用户指定的 shell 密码数据库条目。如果指定了命令,则将其传递给 用于执行的外壳 shell 的 -c 选项。如果未指定命令,则执行交互式 shell。
【讨论】:
我自己尝试做同样的事情时遇到的老问题。
@faho 或 @LaraMaia 的现有解决方案都不能解决问题的第一部分,而这正是我的用例所需要的。两种解决方案都只处理~/.config/fish/functions 中定义的函数。尚未“保存”的内存中函数和别名不起作用。
所以这里有一个适用于别名/内存函数的版本:
function sudo
if functions -q -- "$argv[1]"
set cmdline (
for arg in $argv
printf "\"%s\" " $arg
end
)
set -x function_src (string join "\n" (string escape --style=var (functions "$argv[1]")))
set argv fish -c 'string unescape --style=var (string split "\n" $function_src) | source; '$cmdline
command sudo -E $argv
else
command sudo $argv
end
end
this Gist 的评论和略微扩展的版本。
【讨论】: