【问题标题】:same aliases and functions for user and root in fish shell鱼壳中用户和root的别名和功能相同
【发布时间】:2016-04-11 12:11:22
【问题描述】:

如何使~/.config/fish/config.fish 中定义的别名和~/.config/fish/functions 中定义的函数也可用于root 用户?

符号链接到/root/.config/fish 没有完成这项工作。此外,我还希望能够通过sudo 使用我的函数和别名,目前还不能正常工作。

你们是怎么做到的?

【问题讨论】:

    标签: fish


    【解决方案1】:

    我没有第一个问题的解决方案(我没有任何对 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)将无用,因为它不会改变鱼主会话的状态。

    【讨论】:

    • 酷,谢谢。有效且有意义。我认为这是一个有用的东西。
    • 虽然我喜欢这个函数,但它不能处理包含空格的参数是很危险的。例如:fish 中的ls 也是一个函数。如果我运行sudo ls "My File",它将分别查找名为MyFile 的文件。
    【解决方案2】:

    我对我的 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。

    【讨论】:

      【解决方案3】:

      我自己尝试做同样的事情时遇到的老问题。

      @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 的评论和略微扩展的版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        相关资源
        最近更新 更多