Jay
Jay

Reputation: 2902

What does CUPS's lp return?

I am writing a ruby script that prints by calling:

`/usr/bin/lp -d PrinterQueue -U #{user} #{fileToBePrinted}`

I would like to handle printing errors gracefully, but can't determine what lp returns when I execute it. Usually it is a string like this:

request id is PrinterQueue-68 (1 file(s))

Is there anywhere that describes what lp should return in strange cases?

Thanks!

Upvotes: 1

Views: 1178

Answers (2)

mu is too short
mu is too short

Reputation: 434745

Allow me to elaborate on my comment a little.

You should forget about using backticks for this and go straight to Open3. In particular, Open3.capture3:

out, err, status = Open3.capture3("/usr/bin/lp -d PrinterQueue -U #{user} #{fileToBePrinted}")

Then out will be a string containing the standard output from lp, err will be a string containing the standard error, and status will be a Process::Status instance. You check status.success? to see if the lp command worked and look at err (or show err to the user) if it didn't work.

Upvotes: 2

Keith Thompson
Keith Thompson

Reputation: 263487

The string request id is PrinterQueue-68 (1 file(s)) is what the lp command prints, not what it returns.

If the lp command fails, it will return a non-zero exit status. (It should also print an error message, but those messages aren't necessarily documented and might change from one version to the next.)

As I understand it, you can query the value of $? after invoking a command using backticks. If the command succeeds, $? should be 0. If it fails, it will have some non-zero value.

In a comment, @muistooshort suggests using open3; that's probably more robust and flexible than using backticks.

Upvotes: 0

Related Questions