Jump to content
Florian

ENOENT & path issues (bash + nodeJS)

Recommended Posts

Hey everyone,

 

here's one I can absolutely not figure out for myself:

 

if have this very simple bash script called launcher.sh

#!/bin/bash

node="/usr/local/bin/node"

${node} test.js 127.0.0.1:8374 &> node-out.txt &

and a quite simple node script called test.js

require('easyimage').thumbnail({
	src:"a.jpg", dst:"b.jpg",
	width:60, height:60
}).then(
function(image) {
	console.log('success');
},
function (err) {
	console.log(err);
});

If i call from the terminal node test.js or ./launcher.sh, then everything is fine (I get image a.jpg to be cropped and written to b.jpg), but if i trigger it through a script filter containing only ./launcher.sh, then i get this error:

 

[Error: File not supported.]
 
and I have tried with another less used npm package for test.js:
var resizeCrop = require('resize-crop');
resizeCrop({
		format: 'jpg',
		src: "a.jpg",
		dest: "b.jpg",
		height: 60,
		width: 60,
		gravity: "center"
	}, function(err, filePath){
		if(err) console.log(err);
		else console.log("success");
	}
);

which throws a more verbose error when triggered from a script filter:

 
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:1001:11)
    at Process.ChildProcess._handle.onexit (child_process.js:792:34)
 
Do you guys have any idea why it works from the terminal but not from alfred? On my real script, I'm writing/reading other files and i never have any issues with it...

Share this post


Link to post

If it works just fine from the console but doesn't work from inside Alfred, then it's probably because there are some environmental variables set in your shell that aren't available in Alfred. For testing purposes try putting 

source /Users/USERNAME/.bash_profile

near the top of the launcher script and see if it works.

 

If it solves it, then this method is fine for personal workflows, but it shouldn't be used in a workflow that you're going to distribute because you can't rely on the same profile settings.

Share this post


Link to post

Yes, it does solve it. But what can I do to have it work on other people's computers then?

 

For info, here's my .bash_profile

export PATH="/Users/Flo/Library/Application Support/GoodSync":$PATH
##
# Your previous /Users/Flo/.bash_profile file was backed up as /Users/Flo/.bash_profile.macports-saved_2014-05-10_at_17:16:41
##

# MacPorts Installer addition on 2014-05-10_at_17:16:41: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.


##
# Your previous /Users/Flo/.bash_profile file was backed up as /Users/Flo/.bash_profile.macports-saved_2014-05-10_at_17:22:00
##

# MacPorts Installer addition on 2014-05-10_at_17:22:00: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.

export PATH=/usr/local/bin:$PATH
export CFLAGS=-Qunused-arguments
export CPPFLAGS=-Qunused-arguments

and if it's of any help:

Flo$ echo $PATH
/usr/local/bin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/Users/Flo/Library/Application Support/GoodSync:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/CrossPack-AVR/bin:/usr/texbin
Edited by Florian

Share this post


Link to post

Turns out, it's this part that plays:

export PATH=/usr/local/bin:$PATH

because i have ImageMagick installed there (when did I do that? note to self, stop coding drunk).

 

So I guess there are 2 options: I can use the dependencies manager, of just include the tool in the workflow, right?

Share this post


Link to post

If it works in a script but doesn't work in Alfred, it's always something about the Path settings. Every time.

 

So... is this a workflow that you're making just for yourself, or is it one that you're going to distribute? If you're going to just use it on your own, then you could probably just symlink the tool.

 

If you're going to distribute it, then things get more complicated:

 

If I remember right, ImageMagick is pretty big and often needs to be compiled on the machine because it uses linked libraries, which will often make it fail if distributed otherwise. I know you can compile ImageMagick to be stand-alone (but this standalone would need to be tested on different versions of OS X to make sure that it runs 10.6–10.10, or whatever versions you choose to support). If you can find a way to compile it

 

That being said, the user also needs to have node installed, which runs into the same problems above.

 

So, if you're going to distribute it, you might write up that it needs to have homebrew, nodejs, and imagemagick installed, and then you could just include an install script that will install homebrew (if necessary), nodejs (if necessary), and imagemagick (if necessary). Just make sure that they exist first (for the bash commands, just use "which brew", etc...). That would probably be the best way to make it work because of the number of dependencies that this has.

Share this post


Link to post

Well I'll see about distribution. Ideally I'd want it to be out there, seems more fun that way. But what i'm making is in the same vein as my other frowned upon workflow (piratebay): when i'm done with this one, just typing the keyword will display all the tv shows I follow that have available new episodes and offer to stream them.

 

But yeah I guess the install script would be optimal.

Share this post


Link to post

Oh, and they might also need to download xcode tools... so make sure that you put that in the instructions.

 

The other option would be to try to find things that work more natively. I know that you can use `sips` to resize images just fine, so you won't need ImageMagick for that. You can look to see some stuff about sips on this thread. I also used it in the newer (still unreleased) version of the bundler to convert images between different formats.

 

While coding stuff for Alfred, I have learned that there are a lot of nice tools that already are on OS X that can be used for many things, even if they aren't the most powerful.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...