Octopus Asked: 2022-04-23 09:12:39 +0800 CST2022-04-23 09:12:39 +0800 CST 2022-04-23 09:12:39 +0800 CST 如何在鱼的别名中运行别名? 772 sudo我用please 空格别名: $ alias please='sudo ' $ please ll 我已经在 Fish 中尝试过,但它不起作用: $ alias please='sudo ' $ please ll sudo: ll: command not found alias 1 个回答 Voted Best Answer NotTheDr01ds 2022-04-23T10:28:34+08:002022-04-23T10:28:34+08:00 这里的问题不是嵌套别名。这本身就可以工作,尽管(正如@muru 在评论中指出的那样)与 Bash 有所不同。例如: $ alias a ls $ alias b type $ b a a is a function with definition # Defined via `source` function a --wraps=ls --description 'alias a ls' ls $argv; end Fish 别名的问题sudo是双重的: 首先,为您的用户定义了一个别名,但是当您使用时sudo,您就不再是“您的用户”了。里面的鱼配置sudo是root用户的。不幸的是,附加“空格”的优雅 Bash 解决方案不适用于 Fish。 在将第二个别名传递给第一个别名之前扩展第二个别名的 Bash“尾随空格”解决方法alias please='sudo '在 Fish 中不可用。例如,在前面的示例中,在 Bash 中,您可以使用alias b='type 'to 强制扩展a并对结果而不是aliasls运行type命令。 恕我直言,这绝对是 Bash 拥有比 Fish 更清洁的解决方案的一个领域。 Fish 有一些可能的解决方法,但我认为它们都相当“hacky”,甚至是我自己的。 首先,正如我在 [this Stack Overflow answer] 中提到的,您可以sudo按如下方式定义别名: function please --wraps=sudo --description 'alias please 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 我可能要花一点时间才能准确地记住我是如何得出这个结论的,这就是为什么我在这里留下了一个带有解释的评论版本。 虽然您可能会考虑在 root 用户的 Fish 配置中定义别名,但请注意sudo仅运行外部命令,因此它仍然不会以这种方式运行别名,除非您要求新 fish进程运行它。例如: $ sudo -s $ alias -s ll "ls -l" funcsave: wrote /root/.config/fish/functions/ll.fish $ exit # back to normal user $ sudo fish -c "ll" $ sudo ll sudo: ll: command not found $ sudo fish -c "ll -n /" total 1436 lrwxrwxrwx 1 0 0 7 Apr 23 2020 bin -> usr/bin drwxr-xr-x 2 0 0 4096 Apr 23 2020 boot ...
这里的问题不是嵌套别名。这本身就可以工作,尽管(正如@muru 在评论中指出的那样)与 Bash 有所不同。例如:
Fish 别名的问题
sudo
是双重的:首先,为您的用户定义了一个别名,但是当您使用时
sudo
,您就不再是“您的用户”了。里面的鱼配置sudo
是root
用户的。不幸的是,附加“空格”的优雅 Bash 解决方案不适用于 Fish。在将第二个别名传递给第一个别名之前扩展第二个别名的 Bash“尾随空格”解决方法
alias please='sudo '
在 Fish 中不可用。例如,在前面的示例中,在 Bash 中,您可以使用alias b='type '
to 强制扩展a
并对结果而不是aliasls
运行type
命令。恕我直言,这绝对是 Bash 拥有比 Fish 更清洁的解决方案的一个领域。
Fish 有一些可能的解决方法,但我认为它们都相当“hacky”,甚至是我自己的。
首先,正如我在 [this Stack Overflow answer] 中提到的,您可以
sudo
按如下方式定义别名:我可能要花一点时间才能准确地记住我是如何得出这个结论的,这就是为什么我在这里留下了一个带有解释的评论版本。
虽然您可能会考虑在 root 用户的 Fish 配置中定义别名,但请注意
sudo
仅运行外部命令,因此它仍然不会以这种方式运行别名,除非您要求新fish
进程运行它。例如: