Re: help on system function
by graff (Chancellor) on Jan 05, 2003 at 17:49 UTC
|
I've never heard of "plod"... what is it?
In general, shell builtin commands are only meaningful in
the context of an interactive shell, so trying to use them from within
a perl script usually won't make sense. Note that each
"system()" call in perl invokes a new, distinct shell process
that executes whatever command is passed in the call, so there
is no shell command history in that context -- in other words, even if the
"history" builtin works from within the system call, it will
just return an empty result.
Maybe if you provide a snippet of your code, and/or
some more detail about what you're trying to accomplish,
someone here can suggest a simple way to do what you want.
As a wild guess at that, I wonder if maybe your current perl
script is executing a bunch of system calls, and you want to
log the all of them; why not just open a log file at the start
of the script, and each time you make a system call, print a
line to that log?
| [reply] |
|
|
sorry my earlier post was not clear enough.plod is "personal
logging device " as the author calls it -a perl script
to log your work from the command line.It has one-letter commands
prefixed by a '~'.quite useful if you like working from the
command line ( like I do).You use the "~>" command to run an
external command and send the output to the log. I wanted to
save some complicated command line to the log . I tried
to get them off the history command and it did not work. The plod script
uses perl system function ...
| [reply] |
|
|
If the author of "plod" might object to having his/her code
posted here, that's understandable. If you're able to alter
your copy of "plod", you might consider adding the functionality
that you want -- it would be pretty simple (if the code is
already reasonably well written).
If "plod" has a file handle for the log file, and can use
the "print" command on that handle, you just need to add a
new single-character "plod" command to print the current
command line string to the log file (and then pass it to
the system call as well).
For that matter, if "plod" does not provide its own "history"
functionality, I'm surprised that you find it useful, and
I'd expect that this is the next bit of functionality you'd
want to add -- an array where you push each shell command as you
execute it, and (this is the slightly heavy part) some tilde
command keys to list the array, search for strings in it,
save it to a file, etc.
| [reply] |
|
|
|
|
You'll really need to show us the 'plod' code before we can help figure out what is going on here.
I just had a thought. Is there any reason why you need to use plod in the first place? Unix already allows you to be lazy if you don't want to do a lot of typing on the command line. Why not create an shell alias? For example I often use the command ls -lt | more. That's far too much typing for me so I've got an alias. Here's a snip from my .bash_profile:
alias l='ls -lt | more'
You could also create an alias for the commands you are attempting:
alias foo='somecommand -pdjoh >> /path-to/your-output-file'
Just a thought...
--
vek
-- | [reply] [d/l] [select] |
Re: help on system function
by MarkM (Curate) on Jan 05, 2003 at 22:50 UTC
|
Without additional information, my suspicion would be that system() is invoking /bin/sh to execute your command, and that /bin/sh does not provide a 'history' built-in.
Another alternative may be that system() is invoking your shell in non-interactive mode, and the commands that you are trying to use only exist in interactive mode, or only provide the expected output in interactive mode.
| [reply] |
Re: help on system function
by FamousLongAgo (Friar) on Jan 05, 2003 at 17:31 UTC
|
Please show us your code.
| [reply] |
Re: help on system function
by tachyon (Chancellor) on Jan 05, 2003 at 22:46 UTC
|
All the history command does is open your .bash_history file and print it out with numbers. This does the same:
#!/usr/bin/perl -w
my $me = 'username'; # your username goes here
open HIST, "/home/$me/.bash_history" or die "Can't open /home/$me/.bas
+h_history, $!\n";
while ( my $line = <HIST> ) {
print "$.:\t$line";
}
close HIST;
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
| [reply] [d/l] |