Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: first adventures
On 10/29/2014 01:46 PM, Bart Schaefer wrote:
On Oct 29, 8:41am, Ray Andrews wrote:
}
} So, if there was just some way of matching each line of that output
} from getpermtext() with the appropriate command, then I'd be close to
} the finish line.
Maybe if you told us WHY you're trying to extract this particular bit
of information, in more detail than just --
} if I could then assign that to a shell variable, I'd have exactly what
} I want: each command would have access to the verbatim command line
} 'segment' that called it
-- it might be possible to make better suggestions. I've been answering
on the assumption that you were just trying to learn how the internals
work, but it seems there's a larger motive.
Well, both. I have a real issue, and chewing on it seems like a good
first motivation to dive
into the internals. But I think my questions have been focused enough
that, were it possible to
do as I'm seeking: break up the command line (in the .histfile format as
we've discussed) into
separate individual commands (by semicolons and/or however else that is
done), and be able to
pass that 'literal' command string to the command to which it applies:
whats-my-line()
{
echo "My line was: $some-imaginary-variable"
}
$ whats-my-line $PWD * < > /temp/junk ; what's-my-line '$foo' bar;
whats-my-line "I think that I shall never see"
My line was: $PWD * < > /temp/junk
My line was: '$foo' bar
My line was: "I think that I shall never see"
... then I'd be able to handle the rest.
Really, I just want to grab command arguments 'raw', I look at .histfile
because that's where they
*are* stored raw (except for bangchar expansion, which is fine).
But since you ask about the larger motive (but I waste enough of your
time already):
I like wrappers:
ell is the wrapper around 'ls'. The ,H switch says, 'show me the
'expanded' (or 'real')
command you are about to execute, and write it to history
(for recall with possible modifications, as desired):
Comments are interspersed with screen capture:
$ l ,H main.c*
... it produces a tarted up output:
Sorting All file types Backwards by Modification Time (main.c*):
... and it shows you the 'real' command, and saves it to history:
EXECUTING: ls --time-style=+%F//%T -AGFhrgdt
--group-directories-first --color=always main.c* | egrep '' | egrep
-v "^total"
-rw-r--r-- 1 3.7K 2014-10-28//15:45:56 main.c.unc-backup~
-rw-r--r-- 1 3.7K 2014-10-28//16:21:23 main.c
-rw-r--r-- 1 41 2014-10-28//16:21:23 main.c.unc-backup.md5~
... The last two lines in history:
14561* l ,H main.c*
14562 ls --time-style=+%F//%T -AGFhrgdt --group-directories-first
--color=always main.c* | egrep '' | egrep -v "^total"
... now, I recall and execute the last command in history:
pts/7 HP-y5--5-Debian1 root /aMisc/Z/zsh-5.0.7/Src $ ls
--time-style=+%F//%T -AGFhrgdt --group-directories-first
--color=always main.c* | egrep '' | egrep -v "^total"
-rw-r--r-- 1 3.7K 2014-10-28//15:45:56 main.c.unc-backup~
-rw-r--r-- 1 3.7K 2014-10-28//16:21:23 main.c
-rw-r--r-- 1 41 2014-10-28//16:21:23 main.c.unc-backup.md5~
... and the ouptut it exactly the same because it is exactly the
same 'real' command.
It already works very much as I want, but the scripting is laborious
because the shell can't be
restrained from expanding things. Arguments to the function want to
expand, but that makes
it difficult to show the 'EXECUTING: ...' line because I DONT want any
expansions at all,
just the various arguments from the literal string that I typed. (If
globs expanded you can
imagine the result.)
Oversimplified, I do it like this:
alias l='noglob _l'
function _l ()
{
...
# And once I've cobbled together the 'real' 'ls' command, I use
'eval' to expand any globs
# and it's fine. (Tho I'd like to restrain variable expansion
too, but it's not vital).
echo "$the-big-long-ls-command" >> $HOME/.histfile
fc -R
echo "EXECUTING: $the-big-long-ls-command"
eval "$the-big-long-ls-command"
}
It doesn't matter what I type on CLI, whatever I type goes to history
just the way
I want it. How to get it back? Easy if there was only one command on the
line, but if several:
$ l main.c*; l version.h; l * >! $PWD/file
... .histfile:
14564 l main.c*; l version.h; l * >! $PWD/file
Now, If I could just 'match' each command at execution with the literal
string from whence it
was called, I'd have precisely what I'm looking for: The third call to
ell above would know at
execution that it was called via the literal string: " l * >! $PWD/file
". Knowing the literal string,
I could put together the 'EXECUTING' string with " $PWD " NOT whatever $PWD
evaluates to.
So ... if I can't grab the arguments to a command 'raw', then I'm hoping
that somewhere in the code it might
be possible to tease apart the line in .histfile and send each fragment
to the appropriate command via
a variable. But I think that on principal a command should be able to
grab it's arguments 'raw' if
it wants to. " $@ " = expanded argument list vs: (made up:) " $!@ " =
raw argument list.
Or something ....
Messages sorted by:
Reverse Date,
Date,
Thread,
Author