Solaris /bin/true
-
While playing with the Solaris OS and reading through some of the included programs I came across /bin/true. For those not familiar with a *NIX system, this simply does nothing and returns sucessfully. Realizing that this was a shell script and not a binary executable, I decided to see how it was implemented.
bash-2.05$ cat /bin/true
#!/usr/bin/sh
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
# All Rights Reserved# THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
# The copyright notice above does not evidence any
# actual or intended publication of such source code.#ident "@(#)true.sh 1.6 93/01/11 SMI" /* SVr4.0 1.4 */
bash-2.05$I am not sure which is worse, that this is copyrighted, or that this is version 1.6. It really makes me wonder what the version history looks like.
-
Great! Another piece of unix code reliesed into the wild. Now BSD will not have to re-write this code, and can replace the re-written UCB code with original UNIX!!!
Hmm, [code]//BSD Copyright snipped: Go read it elsewhere.
int
main(void)
{
return 0;
}
[/code]
I think we'll keep our version.
-
So? Now look at GNU /bin/true and /bin/false... they contain a full-fledged option parser just to catch --help and --version:
$ /bin/true --version
true (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jim Meyering.
$ /bin/true --help
Usage: /bin/true [ignored command line arguments]
or: /bin/true OPTION
Exit with a status code indicating success.
--help display this help and exit
--version output version information and exit
NOTE: your shell may have its own version of true, which usually supersedes
the version described here. Please refer to your shell's documentation
for details about the options it supports.
Report bugs to <bug-coreutils@gnu.org>.
What worries me more... the version 5.93, that true can be so complicated or that the GNU people actually expect other "true"s to have extra command line arguments too ("please refer to your shell's documentation for details about the options it supports")?
-
@OpBaI said:
So? Now look at GNU /bin/true and /bin/false... they contain a full-fledged option parser just to catch --help and --version:
I think that's been removed in more recent versions.
What worries me more... the version 5.93, that true can be so complicated or
To be fair, the 5.93 is the version of the whole coreutils package, not just /bin/true.
that the GNU people actually expect other "true"s to have extra command line arguments too ("please refer to your shell's documentation for details about the options it supports")?
That is a bit bizarre, but it's probably just standard boilerplate for when they write a program that's also implemented as a builtin.
-
Can we please see what /bin/false looks like? I'm betting it will make /bin/true looks sensible.
But that is a really sucky way of implementing true. I mean, what if there's something wrong with your sh? OK that's unlikely, but not impossible. Then true could potentially return non-zero. That would seriously mess things up.
-
[quote user="j_johnso"]
While playing with the Solaris OS and reading through some of the included programs I came across /bin/true. For those not familiar with a *NIX system, this simply does nothing and returns sucessfully. Realizing that this was a shell script and not a binary executable, I decided to see how it was implemented.
bash-2.05$ cat /bin/true
#!/usr/bin/sh
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
# All Rights Reserved# THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
# The copyright notice above does not evidence any
# actual or intended publication of such source code.#ident "@(#)true.sh 1.6 93/01/11 SMI" /* SVr4.0 1.4 */
bash-2.05$I am not sure which is worse, that this is copyrighted, or that this is version 1.6. It really makes me wonder what the version history looks like.
[/quote]
1.1 bump copyright notice (dont forget it next years, as we did last year)
-# Copyright (c) 1984 AT&T
+# Copyright (c) 1984, 1986 AT&T1.2 bump copyright notice
-# Copyright (c) 1984, 1986 AT&T
+# Copyright (c) 1984, 1986, 1987 AT&T
1.3 bump copyright notice
-# Copyright (c) 1984, 1986, 1987 AT&T
+# Copyright (c) 1984, 1986, 1987, 1988 AT&T
1.4 bump copyright notice
-# Copyright (c) 1984, 1986, 1987,1988 AT&T
+# Copyright (c) 1984, 1986, 1987, 1988,1989 AT&T
1.5 bump copyright notice
-# Copyright (c) 1984, 1986, 1987,1988, 1989 AT&T
+# Copyright (c) 1984, 1986, 1987, 1988,1989, 1990 AT&T
1.6 damn, we forgot that we dont have the copyright anymore
-# Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T
+# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
-
The null program on IBM mainframes took several tries to get right, too.
http://en.wikipedia.org/wiki/IEFBR14
-
[quote user="iwpg"]
That is a bit bizarre, but it's probably just standard boilerplate for when they write a program that's also implemented as a builtin.
[/quote]
Anyways, I guess that makes it the most feature rich /bin/true ever created, with option parser and full internationalization (I get all those nice messages in german).
-
What are these programs for anyway? I can't imagine how they could possibly be useful.
-
[quote user="HeroreV"]What are these programs for anyway? I can't imagine how they could possibly be useful.
[/quote]while true; do important_server_program_that_should_be_restarted_even_after_crashed; done
-
Oh boy, check out GNU true:
/* Exit with a status code indicating success. Copyright (C) 1999-2003, 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */#include
#include
#include
#include "system.h"/* Act like "true" by default; false.c overrides this. */
#ifndef EXIT_STATUSdefine EXIT_STATUS EXIT_SUCCESS
#endif
#if EXIT_STATUS == EXIT_SUCCESS
define PROGRAM_NAME "true"
#else
define PROGRAM_NAME "false"
#endif
#define AUTHORS "Jim Meyering"
/* The name this program was run with. */
char *program_name;void
usage (int status)
{
printf (_("
Usage: %s [ignored command line arguments]\n
or: %s OPTION\n
"),
program_name, program_name);
printf ("%s\n\n",
(EXIT_STATUS == EXIT_SUCCESS
? "Exit with a status code indicating success."
: "Exit with a status code indicating failure."));
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
printf (("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
exit (status);
}int
main (int argc, char **argv)
{
initialize_main (&argc, &argv);
program_name = argv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);atexit (close_stdout);
/* Recognize --help or --version only if it's the only command-line
argument. */
if (argc == 2)
{
if (STREQ (argv[1], "--help"))
usage (EXIT_STATUS);if (STREQ (argv[1], "--version")) version_etc (stdout, PROGRAM_NAME, GNU_PACKAGE, VERSION, AUTHORS, (char *) NULL); }
exit (EXIT_STATUS);
}
-
[quote user="OpBaI"]So? Now look at GNU /bin/true and /bin/false... they contain a full-fledged option parser just to catch --help and --version:
$ /bin/true --version
true (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jim Meyering.
$ /bin/true --help
Usage: /bin/true [ignored command line arguments]
or: /bin/true OPTION
Exit with a status code indicating success.
--help display this help and exit
--version output version information and exit
NOTE: your shell may have its own version of true, which usually supersedes
the version described here. Please refer to your shell's documentation
for details about the options it supports.
Report bugs to <bug-coreutils@gnu.org>.
What worries me more... the version 5.93, that true can be so complicated or that the GNU people actually expect other "true"s to have extra command line arguments too ("please refer to your shell's documentation for details about the options it supports")?
[/quote]I'm amazed it doesn't support <font face="CourierNew">the -psych argument</font>
-
If I wrote /bin/true, I'd make it support a --false argument that inverted the return value. I'd also make /bin/false look like this:
#!/bin/sh
/bin/true --false
-
[quote user="craiga"]
If I wrote /bin/true, I'd make it support a --false argument that inverted the return value. I'd also make /bin/false look like this:
#!/bin/sh
/bin/true --false
[/quote]
No. The correct solution is to have a /bin/filenotfound with supports both --verynotfalse and --verynottrue arguments. Then, you could impliment true as:
#!/bin/sh
/bin/filenotfound --verynotfalse
And false would be the opposite.
-
When you really think about it, the most correct way to implement filenotfound is not to implement it.
-
[quote user="craiga"]
If I wrote /bin/true, I'd make it support a --false argument that inverted the return value.
[/quote]
Actually, it'd make more sense to have one binary that returns different things based on executable name. /bin/false could be a symlink to /bin/true.
GNU takes the same idea, except they hard-code the thing: as the source code above shows, /bin/false is compiled from the same source as /bin/true. Just that there's false.c which does #define EXIT_STATUS EXIT_FAILURE.
$ ls -l /bin/false /bin/true
-rwxr-xr-x 1 root root 12000 2006-03-02 22:08 /bin/false*
-rwxr-xr-x 1 root root 12000 2006-03-02 22:08 /bin/true*
$ diff -s /bin/false /bin/true
Binary files /bin/false and /bin/true differYep, kind of funny. =)
-
The GNU true source code really just looks like a simple template (with the help and version arguments being pretty standard for all command-line tools).
-
Most systems already come with a fully functional filenotfound utility.
/bin/filenotfound; echo $?
zsh: no such file or directory: /bin/filenotfound
127
/bin/true; echo $?
0
/bin/false; echo $?
1