Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: (feature request) Shell script within shell script



On Sun, Feb 02, 2003 at 12:48:01AM +0900, Clifford Caoile wrote:
> William Park:
> 
> I am not an expert, but I was exploring here documents in bash and zsh
> just this last week. Let me see if I get this right:
> 
> In zsh-4.0.x, you can use "here documents" or "here-strings". A here
> document has this syntax (note there is no double quotations
> necessary):
> 
> >> /etc/hosts <<EOF
> 192.168.0.26 mynewcomputer.zsh.org
> EOF
> 
> This adds the line to the /etc/hosts file. The cat command is
> implicit.  (It's still a useless cat trick, right?)
> 
> A "here string" uses the <<< construct, but I have not used this.
> Please check the docs.
> 
> You can also strip indentation by typing "<<-" instead of just "<<".
> 
> There is also interpretation done within the here document. This has
> bitten me a couple of times. Remember in a bash or zsh here document
> that the '$' (dollar sign), '\' (backslash) and the '`' (backquote)
> are interpreted even inside a here document, so you must prepend a
> backslash, i.e. '\$' and '\\' and '\`'. This make the here document
> look gastly horrid. You mention you will be using Awk/Python/Perl/etc.
> I know that Perl uses $ a lot. Also Awk?  What you will be typing will
> not be easy to keep track because zsh silently substitutes text.
> Debugging will be hard. Is it possible to turn this off?

If you quote EOF (ie. "EOF"), then the content of Here Documents will
not be expanded.  So, no problem with '$', '\', and '`'.

> 
> Of course, you could always try to construct your foreign language
> script line by line. That is what I did before, like this:
> 
> rm $tmpcmdfile
> echo '#! /usr/bin/perl' >> $tmpcmdfile
> ...
> chmod 700 $tmpcmdfile
> $tmpcmdfile
> rm $tmpcmdfile
> 
> Do you like typing? ;-) This example actually led me to exploring here
> documents.
> 
> Specifically with your example, I am unable to ascertain what you want
> to do. Do you want to execute that here document on the line where you
> declare it? What does that "herefile" mean? Is that syntactic sugar
> meaning "foreign language eval?" In any event, I do not know how to do
> that, and I don't think that's a zsh-4.0.x capability.
> 
> Can a real expert answer please? ;-)

However, I'm not talking about redirecting into a real file.  You can do
that with Here Document easily enough.  What I want is similiar to
function.  You define it in the main shell script, and shell will read
and store it in memory.  When you call it, shell will execute the
content just as though it is a real external file script.

If the here content is short, then I can do something like
	awk '...'
or
	python '
	...	(due to indentation)
	'
instead of Here Document.  Of course, the 2 levels of quotes are pain.
The convenience is that you only have to edit 1 file.


> | When writing a shell script, quite often, I have to write bunch of
> | separate Awk/Python/Perl/etc scripts that are more than few lines.  I
> | tend to lose track of which script does what, and get bitten over two
> | levels of quotes.
> |
> | Essentially, I wish I could do something like
> |
> |     herefile test1 << "EOF"
> |     #! /usr/bin/gawk -f
> |     ...
> |     ...
> |     EOF
> |
> | and
> |
> |     herefile test2 << "EOF"
> |     #! /usr/bin/python
> |     ...
> |     ...
> |     EOF
> |
> | so that invocation and usage of 'test1' and 'test2' will be the same as
> | if they were separate real files.
> |
> | Can Zsh do this now?  If not, does Zsh have standard mechanism to
> | provide this kind of extensions?

-- 
William Park, Open Geometry Consulting, <opengeometry@xxxxxxxx>
Linux solution for data management and processing. 



Messages sorted by: Reverse Date, Date, Thread, Author