Оболочка рыбы и выполнение программ из bash через `function`

В настоящее время я пытаюсь запустить редактор атома в оболочке bash, из оболочки fish. Важно, чтобы я выполнял atom в bash из-за того, как ide-haskell обрабатывает разрешение ghc-mod пути и несколько других проблем с стандартизацией.

Вот как я это делал:

#~/.config/fish/config.fish

function start-atom
  bash $HOME/lib/atom/bin/Atom/atom $argv
end

Однако, когда я пытаюсь запустить start-atom из fish, я получаю следующую ошибку:

/home/athan/lib/atom/bin/Atom/atom: /home/athan/lib/atom/bin/Atom/atom: cannot execute binary file

Хотя я знаю, что этот файл является правильным и исполняемым. Есть идеи? Спасибо!

Ответ 1

При запуске bash file_name это означает, что вы пытаетесь запустить file_name как bash script.

Попробуйте это вместо:

bash -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' dummy $argv

-c означает "выполнить эту команду с помощью bash" вместо "запустить этот script с помощью bash".

Как заметил Чарльз в комментариях, нам нужно немного подправить, чтобы передать параметры команде. Мы передаем их в bash, который будет использовать их в качестве позиционных параметров внутри поставляемой команды, следовательно, [email protected].

Ответ 2

должен быть: bash -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' _ $argv

Подчеркивание станет bash $0

Демонстрация:

$ function test_bash_args
      bash -c 'printf "%s\n" "[email protected]"' _ $argv
  end
$ test_bash_args one two three
one
two
three

Если вам нужен этот bash сеанс для загрузки ваших конфигураций, сделайте его оболочкой входа.

Итак, нижняя строка: ~/.config/fish/functions/start-atom.fish

function start-atom
    bash -l -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' _ $argv
end