2015-01-08 3 views
10

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

Вот как я собирался на него:

#~/.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 

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

+0

Что притон для 'atom'? Если он начинается с '#!/Bin/bash', он будет запускаться с bash, несмотря ни на что. –

+0

... если вместо этого вы полагаетесь на функциональность, добавленную через ваши '~/.bashrc',' ~/.bash_profile' и т. Д., То вы не получите этого с тем, что вы делаете в любом случае , так как они получены только для _interactive_ shells. –

+1

(на совершенно другой теме - функции оболочки и псевдонимы имеют очень разную семантику, функция - это * не * подтип псевдонима). –

ответ

11

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

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

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

-c означает «запустить эту команду с Баш» вместо «запустить этот скрипт с Баш».

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

+0

Это означает, что приведенное значение argv будет передано в оболочку, а не передано сценарию 'atom' (поэтому аргументы будут в' $ @ ', когда запускается' $ HOME/lib/atom/bin/Atom/atom'). Это действительно то, что мы хотим здесь? Я думаю, нам нужно, чтобы argv был передан самому сценарию 'atom'. –

+0

...который, если 'atom' имеет правильные исполняемые разрешения и shebang, например, чтобы вызвать вызов bash automatic, будет просто' $ HOME/lib/atom/bin/Atom/atom $ argv' в рыбе. –

+0

... в противном случае это может быть чем-то вроде 'bash -c '$ HOME"/lib/atom/bin/Atom/atom "$ @"' $ argv', но потенциально с некоторыми локальными локальными локальными файлами. (Точка есть то, что если команда, переданная с '-c', не ссылается на' $ @ ', дополнительные аргументы будут игнорироваться). –

4

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

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

демо-Баш в:

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

Если вам нужно что Баш сеанс, чтобы загрузить свои конфиги, сделать его Войти оболочки.

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

function start-atom 
    bash -l -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' _ $argv 
end 
Смежные вопросы