Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does opening a pipeline in Perl involve a shell?

If I do this in a Perl script on a Unix/Linux system:

open(my $fh, 'cat|');

is a shell involved? And if not, what about this:

open(my $fh, 'cat -v|');

I would like to avoid a shell, if possible, and I even know how to do it:

open(my $fh, '-|') || exec('cat', '-v');

but brevity is also valuable.

like image 581
q.undertow Avatar asked Dec 31 '19 23:12

q.undertow


People also ask

How do I open a pipe in Perl?

Perl's open function opens a pipe instead of a file when you append or prepend a pipe symbol to the second argument to open . This turns the rest of the arguments into a command, which will be interpreted as a process (or set of processes) that you want to pipe a stream of data either into or out of.

Can you use pipe in shell script?

Pipe may be the most useful tool in your shell scripting toolbox. It is one of the most used, but also, one of the most misunderstood. As a result, it is often overused or misused. This should help you use a pipe correctly and hopefully make your shell scripts much faster and more efficient.

What is a pipeline in a bash shell?

A pipeline is a sequence of one or more commands separated by one of the control operators ' | ' or ' |& '. The format for a pipeline is. [time [-p]] [!] command1 [ | or |& command2 ] … The output of each command in the pipeline is connected via a pipe to the input of the next command.


1 Answers

From open, following code examples

The last two examples in each block show the pipe as "list form", which is not yet supported on all platforms. A good rule of thumb is that if your platform has a real fork (in other words, if your platform is Unix, including Linux and MacOS X), you can use the list form. You would want to use the list form of the pipe so you can pass literal arguments to the command without risk of the shell interpreting any shell metacharacters in them. However, this also bars you from opening pipes to commands that intentionally contain shell metacharacters, [...]

(my emphasis)

The last example previous to this is

open(my $fh, "-|", "cat", "-n", $file);

which is incidentally almost exactly your example from the question.

So go with the "list form" and there's no shell. This goes for system as well (but, alas, not for qx)

like image 198
zdim Avatar answered Oct 17 '22 04:10

zdim