psql man page error?

Started by Simon Riggsover 19 years ago17 messagesdocs
Jump to latest
#1Simon Riggs
simon@2ndQuadrant.com

On the psql man page there is an example of how to perform multiple line
psql script as part of the -c option description.

The example given is

echo "\x \\ select * from foo;" | psql

which gives

prompt> echo "\x \\ select * from foo;" | psql
Expanded display is on.
invalid command \

i.e. doesn't work on bash. With bash the command should be:

echo -e "\x \n select * from foo;" | psql

which gives

prompt> echo -e "\x \n select * from foo;" | psql
Expanded display is on.
ERROR: relation "foo" does not exist

Does this mean there are multiple forms of the echo command, or is this
example just wrong?

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#2Jeff Frost
jeff@frostconsultingllc.com
In reply to: Simon Riggs (#1)
Re: psql man page error?

On Tue, 5 Dec 2006, Simon Riggs wrote:

which gives

prompt> echo "\x \\ select * from foo;" | psql
Expanded display is on.
invalid command \

i.e. doesn't work on bash. With bash the command should be:

echo -e "\x \n select * from foo;" | psql

which gives

prompt> echo -e "\x \n select * from foo;" | psql
Expanded display is on.
ERROR: relation "foo" does not exist

Does this mean there are multiple forms of the echo command, or is this
example just wrong?

I believe that /bin/echo and the bash built-in used to be slightly different,
although reviewing both man pages on my FC5 system seem to indicate that they
have the same command-line arguments.

It's also possible that I'm thinking back to my Solaris (2.5.1) days when the
built-in tcsh echo was in fact different than /bin/echo. That's why all my
scripts seem to call the binary and not the built-in.

Another possibility is that the original author had the options set in his
xpg_echo environment variable and forgot about it...or his distro was setting
it in a profile.d file.

--
Jeff Frost, Owner <jeff@frostconsultingllc.com>
Frost Consulting, LLC http://www.frostconsultingllc.com/
Phone: 650-780-7908 FAX: 650-649-1954

#3Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#1)
Re: psql man page error?

Simon Riggs wrote:

On the psql man page there is an example of how to perform multiple line
psql script as part of the -c option description.

The example given is

echo "\x \\ select * from foo;" | psql

which gives

prompt> echo "\x \\ select * from foo;" | psql
Expanded display is on.
invalid command \

i.e. doesn't work on bash. With bash the command should be:

echo -e "\x \n select * from foo;" | psql

which gives

prompt> echo -e "\x \n select * from foo;" | psql
Expanded display is on.
ERROR: relation "foo" does not exist

Does this mean there are multiple forms of the echo command, or is this
example just wrong?

Intersting. This example has been around since at least 2002. The SGML
looks like this:

<application>psql</application>, like this: <literal>echo "\x \\
select * from foo;" | psql</literal>.

and I suppose the asumption was that the \\ would be at the end of the
output line, but in fact both HTML and manual pages just put the \\
anywhere on the line. I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.
Change applied to HEAD and 8.2.X.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#3)
Re: psql man page error?

Bruce Momjian <bruce@momjian.us> writes:

I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.

No, they don't, and neither does the Single Unix Spec:
http://www.opengroup.org/onlinepubs/007908799/xcu/echo.html

So your version of the example depends on non-standards-compliant
echo behavior, which is not better than before.

regards, tom lane

#5Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#4)
Re: psql man page error?

On Tue, 2006-12-05 at 13:14 -0500, Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.

No, they don't, and neither does the Single Unix Spec:
http://www.opengroup.org/onlinepubs/007908799/xcu/echo.html

So your version of the example depends on non-standards-compliant
echo behavior, which is not better than before.

So the -e is wrong, but the rest of the change was right. Guess we just
need to add a comment about "(you may need to use the -e option on echo
to get this to work on your OS)."

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#6Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#4)
Re: psql man page error?

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.

No, they don't, and neither does the Single Unix Spec:
http://www.opengroup.org/onlinepubs/007908799/xcu/echo.html

So your version of the example depends on non-standards-compliant
echo behavior, which is not better than before.

Well, at least my example works on _some_ operating systems, while the
previous worked on none of them, so it is _better_.

I can't think of a good way to do this except converting the example to
a <programlisting> block that will not change newlines:

echo '\x
SELECT * FROM foo;' | psql

Is that what people want?

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#7Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#6)
Re: psql man page error?

On Tue, 2006-12-05 at 18:16 -0500, Bruce Momjian wrote:

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.

No, they don't, and neither does the Single Unix Spec:
http://www.opengroup.org/onlinepubs/007908799/xcu/echo.html

So your version of the example depends on non-standards-compliant
echo behavior, which is not better than before.

Well, at least my example works on _some_ operating systems, while the
previous worked on none of them, so it is _better_.

I can't think of a good way to do this except converting the example to
a <programlisting> block that will not change newlines:

echo '\x
SELECT * FROM foo;' | psql

Is that what people want?

Well, it works, but IMHO its not as clear.

--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com

#8Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#7)
Re: psql man page error?

Simon Riggs wrote:

On Tue, 2006-12-05 at 18:16 -0500, Bruce Momjian wrote:

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

I think the proper fix is:

<application>psql</application>, like this: <literal>echo -e
"\\x\nSELECT * FROM foo;" | psql</literal>.

I think all modern operating systems understand echo -e at this point.

No, they don't, and neither does the Single Unix Spec:
http://www.opengroup.org/onlinepubs/007908799/xcu/echo.html

So your version of the example depends on non-standards-compliant
echo behavior, which is not better than before.

Well, at least my example works on _some_ operating systems, while the
previous worked on none of them, so it is _better_.

I can't think of a good way to do this except converting the example to
a <programlisting> block that will not change newlines:

echo '\x
SELECT * FROM foo;' | psql

Is that what people want?

Well, it works, but IMHO its not as clear.

Well, it is even worse because some versions of echo automatically
interpret backslashes, so it would have to be \\x. I am thinking we
should just leave it as I have it now, unless we want to use 'awk' or
'perl' where we know the backslash behavior.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#8)
Re: psql man page error?

Bruce Momjian <bruce@momjian.us> writes:

Well, it is even worse because some versions of echo automatically
interpret backslashes, so it would have to be \\x. I am thinking we
should just leave it as I have it now, unless we want to use 'awk' or
'perl' where we know the backslash behavior.

The example as you have it now is directly contradictory to the
published spec.

I agree with Simon's suggestion to remove "-e" from the example
(thereby making it spec-compliant) and add a parenthetical remark
suggesting that standards-challenged versions of echo might need "-e".

regards, tom lane

#10Peter Eisentraut
peter_e@gmx.net
In reply to: Bruce Momjian (#3)
Re: psql man page error?

Am Dienstag, 5. Dezember 2006 18:41 schrieb Bruce Momjian:

<application>psql</application>, like this: <literal>echo "\x \\
select * from foo;" | psql</literal>.

and I suppose the asumption was that the \\ would be at the end of the
output line, but in fact both HTML and manual pages just put the \\
anywhere on the line.

Which is correct. Removing the \\ alters the point of the example.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

#11Bruce Momjian
bruce@momjian.us
In reply to: Peter Eisentraut (#10)
Re: psql man page error?

Peter Eisentraut wrote:

Am Dienstag, 5. Dezember 2006 18:41 schrieb Bruce Momjian:

<application>psql</application>, like this: <literal>echo "\x \\
select * from foo;" | psql</literal>.

and I suppose the asumption was that the \\ would be at the end of the
output line, but in fact both HTML and manual pages just put the \\
anywhere on the line.

Which is correct. Removing the \\ alters the point of the example.

Well, if it doesn't render \\ at the end of the line, the example isn't
very clear unless you are looking at the SGML.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#12Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#9)
Re: psql man page error?

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

Well, it is even worse because some versions of echo automatically
interpret backslashes, so it would have to be \\x. I am thinking we
should just leave it as I have it now, unless we want to use 'awk' or
'perl' where we know the backslash behavior.

The example as you have it now is directly contradictory to the
published spec.

I agree with Simon's suggestion to remove "-e" from the example
(thereby making it spec-compliant) and add a parenthetical remark
suggesting that standards-challenged versions of echo might need "-e".

Well, I just tried Linux and FreeBSD bash (the default shell?) and they
both need '-e' to render '\n' as a newline, so I think we should just
leave it with '-e'. Following the spec doesn't help if our two major
operating systems don't follow the spec, plus the example doesn't work
on Win32 at all.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#11)
Re: psql man page error?

Bruce Momjian <bruce@momjian.us> writes:

Peter Eisentraut wrote:

Which is correct. Removing the \\ alters the point of the example.

Well, if it doesn't render \\ at the end of the line, the example isn't
very clear unless you are looking at the SGML.

No, you've completely misunderstood the original example. It's
intending to show a backslash-backslash terminator for the \x command,
not two lines of input, ie the equivalent of this:

regression=# \x \\ select 1,2;
Expanded display is on.
-[ RECORD 1 ]
?column? | 1
?column? | 2

regards, tom lane

#14Bruno Wolff III
bruno@wolff.to
In reply to: Bruce Momjian (#12)
Re: psql man page error?

On Wed, Dec 06, 2006 at 09:14:01 -0500,
Bruce Momjian <bruce@momjian.us> wrote:

Well, I just tried Linux and FreeBSD bash (the default shell?) and they
both need '-e' to render '\n' as a newline, so I think we should just
leave it with '-e'. Following the spec doesn't help if our two major
operating systems don't follow the spec, plus the example doesn't work
on Win32 at all.

If you need several lines of output, couldn't you use one echo for each
line and separate them with semicolons?

#15Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#13)
Re: psql man page error?

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

Peter Eisentraut wrote:

Which is correct. Removing the \\ alters the point of the example.

Well, if it doesn't render \\ at the end of the line, the example isn't
very clear unless you are looking at the SGML.

No, you've completely misunderstood the original example. It's
intending to show a backslash-backslash terminator for the \x command,
not two lines of input, ie the equivalent of this:

regression=# \x \\ select 1,2;
Expanded display is on.
-[ RECORD 1 ]
?column? | 1
?column? | 2

You are right, I totally misunderstood it. New patch applied, that
mentions \\ is a separator meta-command. I now see \\ documented
farther down the file. I didn't know it did that.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

Attachments:

/bjm/difftext/x-diffDownload+7-7
#16Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#15)
Re: psql man page error?

Bruce Momjian <bruce@momjian.us> writes:

! pipe the string into <application>psql</application>, like
! this: <literal>echo "\x \\ SELECT * FROM foo;" | psql</literal>.

This should probably use single quotes not double, hm?

regards, tom lane

#17Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#16)
Re: psql man page error?

Tom Lane wrote:

Bruce Momjian <bruce@momjian.us> writes:

! pipe the string into <application>psql</application>, like
! this: <literal>echo "\x \\ SELECT * FROM foo;" | psql</literal>.

This should probably use single quotes not double, hm?

Yep, done.

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

Attachments:

/rtmp/difftext/x-diffDownload+2-2