2015-01-08 10 views
10

ich zur Zeit versucht, die atom editor in der bash Schale, vom fish Shell zu laufen. Es ist wichtig, dass ich atom in bash ausführen, weil ide-haskell ghc-mod Pfadauflösung behandelt, und ein paar andere Standardisierungsprobleme. HierDie Fisch-Shell und Programme von bash Ausführung durch `function`

ist, wie ich es wollte:

#~/.config/fish/config.fish 

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

Allerdings, wenn ich versuche start-atom von fish laufen, bekomme ich folgende Fehlermeldung:

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

Auch wenn ich weiß, diese Datei ist korrekt und ausführbar. Irgendwelche Ideen? Vielen Dank!

+0

Was ist der shebang für 'atom'? Wenn es mit '#!/Bin/bash' beginnt, wird es mit bash ausgeführt, egal was passiert. –

+0

... wenn Sie stattdessen auf Funktionen angewiesen sind, die über Ihre '~/.bashrc',' ~/.bash_profile' usw. hinzugefügt wurden, dann werden Sie das sowieso nicht mit dem, was Sie tun, verbinden , da diese nur für interaktive Schalen geliefert werden. –

+1

(zu einem völlig anderen Thema - Shell-Funktionen und Aliase haben eine sehr unterschiedliche Semantik; eine Funktion ist * nicht * ein Untertyp eines Alias). –

Antwort

11

Wenn Sie bash file_name ausführen, bedeutet das, dass Sie versuchen, file_nameals Bash-Skript auszuführen.

Versuchen Sie stattdessen:

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

Die -c bedeutet "führen Sie diesen Befehl mit bash" statt "dieses Skript mit bash ausführen".

Wie Charles in den Kommentaren hervorgehoben hat, müssen wir ein wenig optimieren, um die Parameter an den Befehl zu übergeben. Wir übergeben sie an bash, die sie als Positionsparameter innerhalb des gelieferten Befehls verwenden, daher die [email protected].

+0

Das bedeutet, dass das übergebene argv an die Shell übergeben wird, anstatt an das 'atom' Skript übergeben zu werden (also werden die Argumente in' $ @ 'wenn' $ HOME/lib/atom/bin/Atom/atom' ausgeführt wird). Wollen wir das wirklich? Ich würde denken, wir möchten, dass das argv an das atom-Skript selbst übergeben wird. –

+0

...Wenn "atom" über geeignete ausführbare Berechtigungen verfügt und "shebang" zum Aufruf von bash automatic verwendet wird, wäre es einfach "$ HOME/lib/atom/bin/Atom/atom $ argv" in Fisch. –

+0

... ansonsten könnte es etwas mehr wie 'bash -c $ HOME" '/ lib/atom/bin/Atom/atom "$ @"' $ argv' sein, aber möglicherweise mit einigen lokalen Fixes. (Punkt-Sein ist, dass, wenn der mit '-c' übergebene Befehl sich nicht auf '$ @ 'bezieht, die zusätzlichen Argumente ignoriert werden). –

4

sollte sein:

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

Wenn Sie diese bash Sitzung benötigen configs zu laden, machen es zu einem Login-Shell: bash -c '$HOME/lib/atom/bin/Atom/atom "[email protected]"' _ $argv

Der Unter $0

eine Demo des bash werden wird.

Also, Fazit: ~/.config/fish/functions/start-atom.fish

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