http://www.perlmonks.org?node_id=416293

theguvnor has asked for the wisdom of the Perl Monks concerning the following question:

Anybody got any neat tricks for determining at run-time whether your script was executed by a user on a command line, versus being run by another process (e.g. a cron job)? I'd like to print more verbose status info to STDOUT if run by a live user on the command line, but more compact "net" info to be piped into a text file if run by cron. I could always alter the script to look for a -v switch, but for my own illumination I was wondering if there was a way that avoided altering my script :-)

Update: thanks both Corion and jfroebe. I don't own the Cookbook, so I wasn't aware of that snippet. I did peruse the perlrun and perlvar docs before posting my question (which I should have mentioned). I never would have thought to look at the -X functions!

[Jon]

  • Comment on How to tell whether script is invoked from command line or not

Replies are listed 'Best First'.
Re: How to tell whether script is invoked from command line or not
by jfroebe (Parson) on Dec 20, 2004 at 20:06 UTC

    Hi,

    This is covered in the "Testing Whether a Program Is Running Interactively" in the Perl Cookbook (ISBN 0-596-00313-7).

    sub I_am_interactive { return -t STDIN && -t STDOUT; }

    Now, this isn't always full proof by any means. You could close either STDIN or STDOUT prior to checking. What I mean, is that if you use the example from the Perl Cookbook, then don't close either descriptor until after you test for interactivity. Be careful... especially if you are going to be using the code snippet in legacy code.

    Jason L. Froebe

    Team Sybase member

    No one has seen what you have seen, and until that happens, we're all going to think that you're nuts. - Jack O'Neil, Stargate SG-1

Re: How to tell whether script is invoked from command line or not
by Corion (Pope) on Dec 20, 2004 at 19:59 UTC

    See perldoc -f -X:

    my $loglevel; $loglevel++ if -t STDOUT; print "Log level is $loglevel\n";

    This will not work if the user is running your program through less or any other pager I guess.