【问题标题】:Define an alias in fish shell在fish shell中定义别名
【发布时间】:2011-02-15 07:41:17
【问题描述】:

我想在fish中定义一些别名。显然应该可以在

中定义它们
~/.config/fish/functions

但是当我重新启动 shell 时它们不会自动加载。有什么想法吗?

【问题讨论】:

  • 下面的答案只有几票,在我看来是正确的。 ./config/fish/functions 中的自动加载似乎只有在每个文件有一个函数时才有效。

标签: linux shell fish


【解决方案1】:

@bozhidar-batsov 给出了一个绝对完整的答案,帮助人们理解 fish 中别名/函数的内部工作原理。阅读fish文档获取别名,还有一个-sflag,用起来确实很方便,但是没看到有人提。

-s 或 --save 使用 funcsave 自动将别名创建的函数保存到您的 fish 配置目录中。

定义和保存别名的单行解决方案(例如): alias cl 'clear' -s。立即适用于所有会话并保持不变。

导航到~/.config/fish/functions/,您将看到cl.fish 文件。

# Defined via `source`
function cl --wraps=clear --description 'alias cl clear'
  clear $argv;
end

【讨论】:

    【解决方案2】:

    我发现之前的答案和 cmets 不必要地不完整和/或令人困惑。我需要做的最低限度是:

    1. 创建~/.config/fish/config.fish。此文件可以选择为软链接。
    2. 添加行alias myalias echo foo bar
    3. 重启fish。要确认定义,请尝试type myalias。试试别名。

    【讨论】:

    • 这非常简单,正是我想要的。
    【解决方案3】:
    1. 如果~/.config/fish/中没有config.fish,则制作。
    2. 在那里你可以写你的函数。function name; command; end

    【讨论】:

      【解决方案4】:

      fish 首先执行 ~/.config/fish/config.fish 中的命令。 如果它不存在,您可以创建它:

      vim ~/.config/fish/config.fish

      并用:wq保存

      第 1 步。制作配置文件(如.bashrc)

      config.fish

      第二步。就这样写你的别名;

      别名 rm="rm -i"

      【讨论】:

      • 在鱼配置中写入对我有用。我想知道为什么 fish 函数没有给我预期的结果。
      【解决方案5】:

      如果您添加 abbr 而不是 alias,您将获得更好的自动完成功能。在 fish 中,abbr 更接近于 bash 别名的行为。

      abbr -a gco git checkout
      

      -add 扩展为git checkout 的新abbreviation gco

      Here's a video demo of the resulting auto-complete features

      【讨论】:

        【解决方案6】:

        只需使用alias。这是一个基本示例:

        # Define alias in shell
        alias rmi "rm -i"
        
        # Define alias in config file
        alias rmi="rm -i"
        
        # This is equivalent to entering the following function:
        function rmi
            rm -i $argv
        end
        
        # Then, to save it across terminal sessions:
        funcsave rmi
        

        最后一条命令创建文件~/.config/fish/functions/rmi.fish

        有兴趣的人可以在the official manual了解更多关于鱼别名的信息。

        【讨论】:

        • 另请注意,在 fish 中,别名只是函数的 shellscript 包装器。
        • @user456584 ...这太糟糕了,因为你不能这样做alias local "set -l" ;-(
        • 记下要放入哪个文件。我把我的放在~/.config/fish/config.fish 中,所以每次运行终端时它都会加载。
        • 我们不需要引用"$argv" 来处理带有空格的参数,就像我们使用bash "$@" 一样吗?
        • @kyb,不,fish 比 bash 更聪明。实际上,fish 中的所有变量都是数组。转到Shell variables 并向下滚动到数组小节
        【解决方案7】:

        在 ~/.config/fish/functions 中创建一个名为 mkalias.fish 的函数并将其放入

        function mkalias --argument key value
          echo alias $key=$value
          alias $key=$value
          funcsave $key
        end
        

        这将自动创建别名。

        【讨论】:

          【解决方案8】:

          ~/.config/fish/functions

          正确加载函数

          您只能在文件中设置 ONE 函数,并将文件名称与函数名称相同 + 添加 .fish 扩展名。

          这种方式在打开的终端中更改文件内容重新加载功能(注意可能会出现一些延迟~1-5s)

          如果你通过命令行编辑,那就这样

          function name; function_content; end
          

          然后

          funcsave name
          

          您在控制台中有用户定义的功能,并以相同的顺序自定义。

          【讨论】:

            【解决方案9】:

            对于后代来说,鱼的别名只是函数:

            $ alias foo="echo bar"
            $ type foo
            foo is a function with definition
            function foo
                echo bar $argv; 
            end
            

            删除它

            $ unalias foo
            /usr/bin/unalias: line 2: unalias: foo: not found
            $ functions -e foo
            $ type foo
            type: Could not find “foo”
            

            【讨论】:

            • 创建函数后,可以funcsave foo。这会将函数保存到~/.config/fish/functions/foo.fish,第一次从新会话中调用它时,鱼会自动加载它。
            • alias foo="echo bar" 是迄今为止最简单的解决方案
            • unalias 在fish 3.2.0 中不可用
            • 它从未在鱼中可用。这就是为什么我证明它会引发错误。
            【解决方案10】:

            将您的文件保存为 ~/.config/fish/functions/{some_function_name}.fish,它们应该会在您开始钓鱼时自动加载。

            【讨论】:

              【解决方案11】:

              这就是我定义一个新函数foo、运行它并永久保存它的方式。

              sthorne@pearl~> function foo
                                  echo 'foo was here'
                              end
              sthorne@pearl~> foo
              foo was here
              sthorne@pearl~> funcsave foo
              

              【讨论】:

              • 谢谢杰鲁布。由于某种原因,在funcsave之后它给了我一个错误:troff:致命错误:无法打开`/usr/share/fish/man/save_function.1':没有这样的文件或目录
              • 您还可以使用funced 编辑函数。例如。 funced foo.
              • 运行funcsave {some_function_name}会将其保存在~/.config/fish/functions/{some_function_name}.fish
              • 我保存了 grep 函数,以便它使用 rg 代替。但是当我使用grep --version 命令时,它并没有给出类似于rg --version 的输出。为什么?! @Hjulle
              • @Pranav 您运行的命令序列是:alias grep=rgfuncsave grepgrep --version
              猜你喜欢
              • 2017-02-17
              • 2015-03-21
              • 1970-01-01
              • 2023-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-04
              • 1970-01-01
              相关资源
              最近更新 更多