鱼壳和执行程序从bash通过`function`

Ath*_*ark 10 bash executable fish

我目前正试图运行 原子编辑器 中bash壳,从fish壳.重要的是,我跑atom的bash,因为IDE-哈斯克尔如何处理ghc-mod路径的分辨率,和其他一些标准化的问题.

我是这样做的:

#~/.config/fish/config.fish

function start-atom
  bash $HOME/lib/atom/bin/Atom/atom $argv
end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行start-atom时fish,我收到以下错误:

/home/athan/lib/atom/bin/Atom/atom: /home/athan/lib/atom/bin/Atom/atom: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

即使我知道这个文件是正确的和可执行的.有任何想法吗?谢谢!

Mr.*_*ama 11

当你运行bash file_name它意味着你试图file_name 作为bash脚本运行.

试试这个:

bash -c '$HOME/lib/atom/bin/Atom/atom "$@"' dummy $argv
Run Code Online (Sandbox Code Playgroud)

的-c意思是"运行此命令,而不是"运行此脚本使用bash"在bash".

正如Charles在评论中指出的那样,我们必须进行一些调整以将参数传递给命令.我们传递它们bash将它们用作提供的命令内部的位置参数,因此$@.


gle*_*man 5

应该:bash -c '$HOME/lib/atom/bin/Atom/atom "$@"' _ $argv

下划线将变成 bash 的$0

演示:

$ function test_bash_args
      bash -c 'printf "%s\n" "$@"' _ $argv
  end
$ test_bash_args one two three
one
two
three
Run Code Online (Sandbox Code Playgroud)

如果您需要 bash 会话来加载配置,请将其设为登录 shell。

所以,底线是:~/.config/fish/functions/start-atom.fish

function start-atom
    bash -l -c '$HOME/lib/atom/bin/Atom/atom "$@"' _ $argv
end
Run Code Online (Sandbox Code Playgroud)