【问题标题】:Change directory in fish function and return to original directory after abort在fish函数中更改目录并在中止后返回原始目录
【发布时间】:2014-03-20 17:31:32
【问题描述】:

我正在从 bash 切换到 fish,但是在移植我经常使用的便利功能时遇到了麻烦。这个函数的重点是从我的源代码树的根目录运行make,不管我的shell当前在哪个目录。

在 bash 中,这很简单:

function omake {(
  cd $SOURCE_ROOT;
  make $@;
)}

由于鱼没有亚壳,所以我能做的最好的事情是:

function omake
    pushd
    cd $SOURCE_ROOT
    make $argv
    popd
end

这可行,但需要注意的是,在使用 ^C 中断 fish 版本后,shell 仍在 $SOURCE_ROOT 中,但中断 bash 版本会使我回到原始目录。

有没有办法编写一个与 fish 中的 bash 相同的脚本?

【问题讨论】:

    标签: shell fish


    【解决方案1】:

    这是尽可能接近子shell:

    function omake
        echo "cd $SOURCE_ROOT; and make \$argv" | fish /dev/stdin $argv
    end
    

    进程替换似乎不可中断:Ctrl-C 不会停止此睡眠 cmd

    echo (cd /tmp; and sleep 15)
    

    不过,fish 有一个非常好的方法可以找到后台进程的 pid:

    function omake
        pushd dir1
        make $argv &
        popd
    end
    

    然后,要停止制作,而不是 Ctrl-C,请执行 kill %make

    【讨论】:

      【解决方案2】:

      如果您使用的是 GNU coreutils,则可以使用 env 来执行此操作(如 user2394284 建议的那样很好)。

      env -C foo pwd
      

      这将在名为foo 的子目录中很好地运行pwd。这通常与鱼很好地交互,例如它可以很好地作为背景

      docs 说:

      在调用命令之前将工作目录更改为 dir。这与 shell 内置 cd 的不同之处在于它将命令作为子进程启动,而不是更改 shell 自己的工作目录;这允许它与在不同上下文中运行命令的其他命令链接。

      【讨论】:

      • 在 macOS 上,在 brew install coreutils 之后,您可以使用 genv -C foo pwd 来执行此操作
      【解决方案3】:

      对于make,你可以使用-C选项:

      function omake
          make -C $SOURCE_ROOT $argv
      end
      

      许多其他程序采用-C 选项。在我的头顶上:忍者,git

      否则,如果您对 subshel​​l 感到满意,那么独立脚本可以满足您的要求,其好处是您可以用任何语言编写它,从 Python 到 C,并且在您使用时不必重写它想换壳。

      这可以用任何语言编写:

      #!/usr/bin/env fish
      cd $SOURCE_ROOT
      and exec make $argv
      

      然而,真正困扰我的是env 中的-C 选项的公然遗漏! env可以设置环境变量和运行程序;显然,能够设置工作目录也将是很好!这是一个基本的cdrun 脚本来弥补这一点:

      #!/usr/bin/env fish
      cd $argv[1]
      and exec env $argv[2..-1]
      

      #!/bin/sh
      set cd="$1"
      shift
      cd "$cd" &&
      exec env "$@"
      

      使用cdrun 命令,您的omake 函数将非常简单:

      function omake
          cdrun $SOURCE_ROOT make $argv
      end
      

      omake() {
          cdrun "$SOURCE_ROOT" make "$@"
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 2020-07-20
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 2013-09-22
        • 2014-08-09
        • 2016-03-30
        • 2013-06-07
        相关资源
        最近更新 更多