Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: preserve quotes after $0 interpolation

by bliako (Monsignor)
on Dec 13, 2019 at 07:02 UTC ( [id://11110052]=note: print w/replies, xml ) Need Help??


in reply to preserve quotes after $0 + @ARGV interpolation

quoting @ARGV items back could be a challenge only when they are quoted. Otherwise quote them with single quotes, since bash had already interpolated anything that should had been interpolated.

In the case there are quotes, I have not given it too much thought, but this can quote back your command line to equivalent effect to the original (but not the same):

print join ' ', ($0, map { qw/$'/ . s/'/\\'/gr . qw/'/ } @ARGV);

Assuming bash. If you find you need a lot of tweaking and extra cases handling then the path you are following is the wrong one and you probably do not need the actual command line verbatim.

btw, $0 holds your command and @ARGV your command arguments.

bw, bliako

p.s. at the time of writing this, ikegami suggested something more robust because it uses an existing module (with probably all the edges covered). What the heck! Every time a one-liner is thrown away a sailor is drowned in the high seas, so here you go.

Replies are listed 'Best First'.
Re^2: preserve quotes after $0 + @ARGV interpolation
by richard.sharpe (Sexton) on Dec 13, 2019 at 12:56 UTC

    Thank you. I fixed my original question ($0 was not enough, of course). The idea with the shell history in combination with requirement to invoke script from particular shell and by particular way, would be probably the way for me. I would like to catch it as close as original as possible, therefore I am escaping ~ with \~ and * with \*, to let Perl, and not shell, expand tem, to preserve unexpanded version of invocation in Perl script.

      Here is a hint: file bashhist.c in the bash source code (v5), modify function pre_process_line() to dump line to your own file so that you do not rely on users' history settings (which can be disabled, purged or modified by other shells running at the same time). That's based on my diagonal look at the source code.

      If what you are doing is worth the investment, find out exactly where bash executes commands and intervene before expanding and interpolating the command line (that may be in readline). In this way you may even be able to pass an extra argument to Perl with the original commandline! far-fetched I know.

      bw, bliako

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11110052]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (6)
As of 2024-04-20 00:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found