34367


alias be 'bundle exec' (もしくは be.fish を function 以下に作成) して設定していても, env
と一緒に実行すると展開されない,  
`env RAILS_ENV=development be rails s` のコマンド内で be が `bundle exec`
として認識されないと思うのですが, これを fish でどうにか展開してくれる方法はあるのでしょうか？

`env RAILS_ENV=development bundle exec rails s` は勿論認識されるので,
どうにかできないかなという気持ちです。よろしくお願いします。


CC BY-SA 3.0
2017-04-28T02:04:59.407
34342
2017-04-29T02:51:21.017
20779
question
shell
fish シェルのコマンド入力時に env と alias 両方を使いたい


env が外部コマンドのため、alias を解釈するのは無理です。  
alias を解釈できるようにするには、env を function にするしかないと思います。

サンプルを作ってみました。

[code]

    function env
        set -l i 1
        set -l loop 1
        while test $loop -ne 0 -a $i -le (count $argv)
            switch $argv[$i]
            case '*=*'
                set -l k (echo $argv[$i] | sed -e 's/=.*//')
                set -l v (echo $argv[$i] | sed -E 's/.*?=//')
                set --export $k $v
                set i (echo $i+1|bc)
            case '*'
                set loop 0
            end
        end
    
        if test $i -gt (count $argv)
            command env
        else
            eval $argv[$i..-1]
        end
    end
    
[/code]

ただし、このサンプルだといくつか制限がありまして、

  * `env FOO=1 env | grep FOO` しても何も出ない。
  * `env FOO=1 /bin/sh -c 'echo $FOO'` しても何も出ない。

です。

  * `env FOO=1 ll`
  * `env FOO=1 printenv FOO`

が問題ないので、質問に書かれている用途には使えると思います。


CC BY-SA 3.0
2017-04-29T02:51:21.017
34367
2017-04-29T02:51:21.017
5288
34342
answer