in reply to [SHELL] Detect backslash in command line args

That's a very good problem.

As others have mentioned, osx/linux strips the command line before passing the arguments to perl, and so I don't know of any way that perl could "see" the unprocessed arguments.

bash has handy tools that can retrive historical command line arguments. The catch as I see it is that while ~/.bash_history is fully available to your perl script, and contains the unprocessed command line arguments, it only updates when you log out of the shell, and so won't contain the last command issued.

bash does keep a record of unprocessed command lines in working memory. These can be printed at the command line for example with:

history | tail -5

where the last digit determines the number of previous commands to print at the terminal. These are also unprocessed. The problem is that the history command isn't a bash executable, and so doesn't work in the context of a system() call by Perl. Maybe someone knows how to get around this? Would be interested to find the answer.

Michael

Replies are listed 'Best First'.
Re^2: [SHELL] Detect backslash in command line args
by syphilis (Archbishop) on Jul 09, 2013 at 00:19 UTC
    The problem is that the history command isn't a bash executable, and so doesn't work in the context of a system() call by Perl.

    Might Term::UI::History be of help here ?
    Looks like accessing the shell's history is the only hope.

    Thanks for the confirmations that this isn't trivial anywhere except MS Windows shells (which, I'm assuming, arises because on Windows the backslash is not necessarily an escape).
    I have a perl script that I can use to transfer files from my Windows 7 box to my Ubuntu box. If I do perl get.pl C:/some/file all is fine. I was merely hoping to catch the error when I inadvertently do perl get.pl C:\some\file.
    It's not really such a big deal because I eventually find out about the error anyway - and it's not actually an error that I'm liable to make with great frequency.

    Cheers,
    Rob

      It doesn't arise on Windows, because the OS doesn't process the command line, just hands it straight to perl.

      I'm not certain that Term::UI::History wouldn't work, but because it couldn't be running when the command line is processed by the OS, I can't quite see how it would work.

      If your main concern is that you might ask perl to get a file that doesn't exist, I would use something like:

      die "$fileName not found.\n\n" if !-e $fileName;

      If it's writing to a new file, maybe you could similarly check that the directory exists, before writing to the file ?

      In any case, it's still a good question, and if you do figure out an answer, please let me know!

      Michael