Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!bunyip.cc.uq.oz.au!munnari.OZ.AU!news.ecn.uoknor.edu!news.ysu.edu!odin.oar.net!malgudi.oar.net!imci4!newsfeed.internetmci.com!howland.reston.ans.net!Germany.EU.net!zib-berlin.de!irz401!uriah.heep!news From: j@uriah.heep.sax.de (J Wunsch) Newsgroups: comp.unix.bsd.freebsd.misc Subject: Re: Bug in ECHO? Date: 22 Feb 1996 20:35:23 GMT Organization: Private BSD site, Dresden Lines: 115 Message-ID: <4gik2b$pmm@uriah.heep.sax.de> References: <4famj5$4hf@complete.org> <4gb0lt$d34@uriah.heep.sax.de> <Dn45F4.LpB@theatre.pandora.sax.de> Reply-To: joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch) NNTP-Posting-Host: localhost.heep.sax.de Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Newsreader: knews 0.9.3 mw@theatre.pandora.sax.de (Martin Welk) writes: > >The echo command in *BSD is not supposed to expand backslashes. It > >should echo its argument, not interpret them. > > > >The functionality you are looking for can be found in printf(1). > > Unfortunately, this is not directly available in shell scripts. Why not? > Sometimes it's a kind of philosophy if people like bash or not, but > at least, it works using the internal echo command - I even get more > functionality with it. I didn't want to convert everything to perl > or something like that, so using bash was the easier way for me. > And it works good, although performance could be better. First, that's what Posix says: 4.19 echo - Write arguments to standard output 475 string A string to be written to standard output. If the first operand is "-n" or if any of the operands contain a backslash (\) character, the results are implementation defined. So you cannot rely on it, either. However, you can rely on printf(1) doing this (even though the joint subset of BSD and SysV printf is not very big -- BSD's behaves almost like printf(3), SysV's does only handle strings). (3) In addition to the escape sequences shown in Table 2-15 (see 2.12), \ddd, where ddd is a one-, two-, or three-digit octal number, shall be written as a byte with the numeric value specified by the octal number. And that's table 2-15: Table 2-15 - Escape Sequences _________________________________________________________________________ Escape Represents Sequence Character Terminal Action _________________________________________________________________________ \\ backslash None. \a <alert> Attempts to alert the user through audible or visible notification. \b <backspace> Moves the printing position to one column before the current position, unless the current position is the start of a line. \f <form-feed> Moves the printing position to the initial printing position of the next logical page. \n <newline> Moves the printing position to the start of the next line. \r <carriage-return> Moves the printing position to the start of the current line. \t <tab> Moves the printing position to the next tab position on the current line. If there are no more tab positions left on the line, the behavior is undefined. \v <vertical tab> Moves the printing position to the start of the next vertical tab position. If there are no more vertical tab positions left on the page, the behavior is undefined. _________________________________________________________________________ Finally, the bash doesn't work for me either as you expect it: j@uriah 613% bash bash$ echo "a\tb\n" a\tb\n bash$ exit j@uriah 614% ksh $ echo "a\tb\n" a b $ j@uriah 615% j@uriah 615% sh $ printf "a\tb\n" a b $ j@uriah 616% Finally, a SVR4.2 (you've seen the machine today, btw. :): j@smiley 101% sh $ echo "a\tb\n" a b $ echo -n "a\tb\n" a b $ j@smiley 102% j@smiley 102% ksh $ echo "a\tb\n" a b $ echo -n "a\tb\n" a b $ printf "a\tb\n" a b $ As you can see, the SysV does even recognize the -n option, but it does also behave Posix-correctly for the printf. -- cheers, J"org joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE Never trust an operating system you don't have sources for. ;-)