AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1403822
Accepted
Octopus
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 1 个回答
  • 215 Views

1 个回答

  • Voted
  1. 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
    ...
    
    • 3

相关问题

  • 如何创建一个永久的 Bash 别名?

  • 如何为 cd 和 ls 创建别名?

  • Apache 别名无法正常工作

  • 覆盖可执行文件以添加默认标志

  • 别名:.bash_rc、.bash_aliases 和 /usr/local/bin 之间的区别

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve