2015-01-08 32 views
10

Attualmente sto cercando di eseguire il atom editor nel bash shell, dal fish shell. È importante eseguire atom in bash a causa di come ide-haskell gestisce la risoluzione del percorso ghc-mod e alcuni altri problemi di standardizzazione.Il guscio di pesce e l'esecuzione di programmi da bash attraverso `function`

Ecco come stavo andando a esso:

#~/.config/fish/config.fish 

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

Tuttavia, quando provo correre start-atom da fish, ottengo il seguente errore:

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

Anche se so che questo file è corretto ed eseguibile. Qualche idea? Grazie!

+0

Qual è la baracca per 'atom'? Se inizia con '#!/Bin/bash', verrà eseguito con bash indipendentemente da cosa. –

+0

... se, invece, stai facendo affidamento sulla funzionalità aggiunta tramite '~/.bashrc',' ~/.bash_profile', ecc., Allora non lo otterrai con quello che stai facendo comunque , dal momento che quelli sono originati solo per _interactive_ shells. –

+1

(su un argomento completamente diverso - le funzioni di shell e gli alias hanno una semantica molto diversa, una funzione è * non * un sottotipo di un alias). –

risposta

11

Quando si esegue bash file_name significa che si sta tentando di eseguire file_namecome uno script di bash.

Prova a modificare:

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

Il -c significa "Esegui il comando con bash" invece di "eseguire questo script con bash".

Come ha sottolineato Charles nei commenti, dobbiamo eseguire un po 'di regolazione per passare i parametri al comando. Li passiamo a bash che li userà come parametri posizionali all'interno del comando fornito, da cui il [email protected].

+0

Ciò significa che l'argv dato verrà passato alla shell, anziché passato allo script 'atom' (quindi gli argomenti saranno in' $ @ 'quando viene eseguito' $ HOME/lib/atom/bin/Atom/atom'). E 'davvero quello che vogliamo qui? Penso che vorremmo che l'argv sia passato allo script 'atom' stesso. –

+0

...che, se 'atom' ha i permessi eseguibili corretti e shebang tale da rendere invocazione di bash automatica, sarebbe semplicemente' $ HOME/lib/atom/bin/Atom/atom $ argv' nel pesce. –

+0

... altrimenti, potrebbe essere qualcosa di più simile a 'bash -c" $ HOME "'/ lib/atom/bin/Atom/atom" $ @ "' $ argv', ma potenzialmente con alcune correzioni locali di pesce. (L'essere punto è che se il comando passato con '-c' non si riferisce a' $ @ ', gli argomenti extra saranno ignorati). –

4

dovrebbe essere: bash -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' _ $argv

La sottolineatura diventerà di bash $0

Una demo:

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

Se avete bisogno di quella sessione bash per caricare i file di configurazione, ne fanno una shell di login.

Quindi, linea di fondo: ~/.config/fish/functions/start-atom.fish

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