GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan Antara 'env' dan 'printenv'?

Apa perbedaan antara dua perintah env dan printenv ? Keduanya menunjukkan variabel lingkungan, dan outputnya persis sama selain _ .

Apakah ada alasan historis mengapa ada dua perintah, bukan satu?

Jawaban yang Diterima:

Apakah ada alasan historis mengapa ada dua perintah, bukan
dari satu?

Ada, hanya cara sejarah.

  1. Bill Joy menulis versi pertama printenv perintah pada tahun 1979 untuk BSD.
  2. Sistem UNIX III memperkenalkan env perintah pada tahun 1980.
  3. GNU mengikuti env Sistem UNIX pada tahun 1986.
  4. BSD mengikuti env Sistem GNU/UNIX pada tahun 1988.
  5. MINIX mengikuti printenv BSD pada tahun 1988.
  6. GNU mengikuti printenv MINX/BSD pada tahun 1989.
  7. Utilitas pemrograman shell GNU 1.0 termasuk printenv dan env pada tahun 1991.
  8. GNU Shell Utilities bergabung ke dalam GNU coreutils pada tahun 2002, yang Anda temukan di GNU/Linux saat ini.

Perhatikan bahwa "diikuti" tidak berarti kode sumbernya sama, mungkin kode tersebut ditulis ulang untuk menghindari tuntutan hukum lisensi.

Jadi, alasan mengapa kedua perintah itu ada adalah karena Bill Joy menulis printenv bahkan sebelum env ada.
Setelah 10 tahun penggabungan/kompatibilitas dan GNU menemukannya, Anda sekarang melihat kedua perintah serupa di halaman yang sama.

Riwayat ini ditunjukkan sebagai berikut: (Saya mencoba meminimalkan jawaban dan hanya menyediakan 2 cuplikan kode sumber penting di sini. Selebihnya Anda dapat mengklik tautan terlampir untuk melihat lebih banyak)

[musim gugur 1975]

Juga tiba pada musim gugur 1975 adalah dua mahasiswa pascasarjana yang tidak diperhatikan, Bill Joy dan Chuck Haley; mereka berdua langsung tertarik pada sistem baru. Awalnya, mereka mulai mengerjakan sistem Pascal yang telah diretas Thompson bersama-sama saat berkeliaran di ruang mesin 11/70.

[1977]

Joy mulai mengkompilasi Berkeley Software Distribution (1BSD) pertama, yang dirilis pada 9 Maret 1978. //rf:https://en.wikipedia.org/wiki/Berkeley_Software_Distribution

[Februari 1979]

1979(lihat “Bill Joy, UCB Februari, 1979”) /1980(lihat “hak cipta[] =”)
, printenv.c //rf:http://minnie.tuhs.org/cgi-bin/ utree.pl?file=2.11BSD/src/ucb/printenv.c

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
 All rights reserved.\n";
#endif not lint

#ifndef lint
static char sccsid[] = "@(#)printenv.c  5.1 (Berkeley) 5/31/85";
#endif not lint

/*
 * printenv
 *
 * Bill Joy, UCB
 * February, 1979
 */

extern  char **environ;

main(argc, argv)
    int argc;
    char *argv[];
{
    register char **ep;
    int found = 0;

    argc--, argv++;
    if (environ)
        for (ep = environ; *ep; ep++)
            if (argc == 0 || prefix(argv[0], *ep)) {
                register char *cp = *ep;

                found++;
                if (argc) {
                    while (*cp && *cp != '=')
                        cp++;
                    if (*cp == '=')
                        cp++;
                }
                printf("%s\n", cp);
            }
    exit (!found);
}

prefix(cp, dp)
    char *cp, *dp;
{

    while (*cp && *dp && *cp == *dp)
        cp++, dp++;
    if (*cp == 0)
        return (*dp == '=');
    return (0);
}

[1979]

Sulit ditentukan dirilis di 2BSD ATAU 3BSD //rf:https://en.wikipedia.org/wiki/Berkeley_Software_Distribution

  • 3BSD
    Perintah printenv muncul di 3.0 BSD. //rf:http://www.freebsd.org/cgi/man.cgi?query=printenv&sektion=1#end 3.0 BSD diperkenalkan pada 1979 //rf:http://gunkies.org/wiki/3_BSD

  • 2BSD
    Perintah printenv pertama kali muncul di 2BSD //rf:http://man.openbsd.org/printenv.1

[Juni 1980]

UNIX Rilis 3.0 ATAU “UNIX System III” //rf:ftp://pdp11.org.ru/pub/unix-archive/PDP-11/Distributions/usdl/SysIII/

[[email protected] pdp11v3]$ sudo grep -rni printenv . //no such printenv exist.
[[email protected] pdp11v3]$ sudo find . -iname '*env*'
./sys3/usr/src/lib/libF77/getenv_.c
./sys3/usr/src/lib/libc/vax/gen/getenv.c
./sys3/usr/src/lib/libc/pdp11/gen/getenv.c
./sys3/usr/src/man/man3/getenv.3c
./sys3/usr/src/man/docs/c_env
./sys3/usr/src/man/docs/mm_man/s03envir
./sys3/usr/src/man/man7/environ.7
./sys3/usr/src/man/man1/env.1
./sys3/usr/src/cmd/env.c
./sys3/bin/env
[[email protected] pdp11v3]$ man ./sys3/usr/src/man/man1/env.1 | cat //but got env already
ENV(1)                                                                General Commands Manual                                                                ENV(1)



NAME
       env - set environment for command execution

SYNOPSIS
       env [-] [ name=value ] ...  [ command args ]

DESCRIPTION
       Env obtains the current environment, modifies it according to its arguments, then executes the command with the modified environment.  Arguments of the form
       name=value are merged into the inherited environment before the command is executed.  The - flag causes the inherited environment to be ignored  completely,
       so that the command is executed with exactly the environment specified by the arguments.

       If no command is specified, the resulting environment is printed, one name-value pair per line.

SEE ALSO
       sh(1), exec(2), profile(5), environ(7).



                                                                                                                                                             ENV(1)
[[email protected] pdp11v3]$ 
[[email protected] pdp11v3]$ cat ./sys3/usr/src/cmd/env.c //diff with http://minnie.tuhs.org/cgi-bin/utree.pl?file=pdp11v/usr/src/cmd/env.c version 1.4, you will know this file is slightly older, so we can concluded that this file is "env.c version < 1.4"
/*
 *      env [ - ] [ name=value ]... [command arg...]
 *      set environment, then execute command (or print environment)
 *      - says start fresh, otherwise merge with inherited environment
 */
#include <stdio.h>

#define NENV    100
char    *newenv[NENV];
char    *nullp = NULL;

extern  char **environ;
extern  errno;
extern  char *sys_errlist[];
char    *nvmatch(), *strchr();

main(argc, argv, envp)
register char **argv, **envp;
{

        argc--;
        argv++;
        if (argc && strcmp(*argv, "-") == 0) {
                envp = &nullp;
                argc--;
                argv++;
        }

        for (; *envp != NULL; envp++)
                if (strchr(*envp, '=') != NULL)
                        addname(*envp);
        while (*argv != NULL && strchr(*argv, '=') != NULL)
                addname(*argv++);

        if (*argv == NULL)
                print();
        else {
                environ = newenv;
                execvp(*argv, argv);
                fprintf(stderr, "%s: %s\n", sys_errlist[errno], *argv);
                exit(1);
        }
}

addname(arg)
register char *arg;
{
        register char **p;

        for (p = newenv; *p != NULL && p < &newenv[NENV-1]; p++)
                if (nvmatch(arg, *p) != NULL) {
                        *p = arg;
                        return;
                }
        if (p >= &newenv[NENV-1]) {
                fprintf(stderr, "too many values in environment\n");
                print();
                exit(1);
        }
        *p = arg;
        return;
}

print()
{
        register char **p = newenv;

        while (*p != NULL)
                printf("%s\n", *p++);
}

/*
 *      s1 is either name, or name=value
 *      s2 is name=value
 *      if names match, return value of s2, else NULL
 */

static char *
nvmatch(s1, s2)
register char *s1, *s2;
{

        while (*s1 == *s2++)
                if (*s1++ == '=')
                        return(s2);
        if (*s1 == '\0' && *(s2-1) == '=')
                return(s2);
        return(NULL);
}
[[email protected] pdp11v3]$

[1985]

Terkait:Stok vs Kaldu – Apa perbedaan penggunaan?

manual printenv pertama BSD //rf:http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.11BSD/src/man/man1/printenv.1

Saya tidak dapat menemukan manual yang terkait dengan env, tetapi yang paling dekat adalah getenv dan environ //http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.11BSD/src/man

[1986]

Versi pertama dari GNU env //rf:ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/1.0-RELEASE/ports/shellutils/src/env.c

[1987]

MINIX 1 dirilis //rf:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum

  • Tanenbaum menulis tiruan dari UNIX, yang disebut MINIX (MINi-unIX), untuk IBM PC. Itu ditargetkan pada siswa dan orang lain yang ingin mempelajari cara kerja sistem operasi.

[1988]

Env.c pertama BSD //http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.11BSD/src/usr.sbin/cron/env.c

/* Copyright 1988,1990,1993,1994 by Paul Vixie
 * All rights reserved

[4 Oktober 1988]

MINIX versi 1.3 //rf:https://groups.google.com/forum/#!topic/comp.os.minix/cQ8kaiq1hgI


32932 190 /minix/commands/printenv.c //printenv.c sudah ada

//rf:http://www.informatica.co.cr/linux/research/1990/0202.htm

[1989]

Versi pertama dari GNU printenv , lihat [12 Agustus 1993].

[16 Juli 1991]

“Shellutils” – Utilitas pemrograman shell GNU 1.0 dirilis
//rf:https://groups.google.com/forum/#!topic/gnu.announce/xpTRtuFpNQc

Program dalam paket ini adalah:

nama dasar tanggal dirname env expr groups id logname pathchk printenv printf sleep tee tty whoami yes nice nohup stty uname

[12 Agustus 1993]

printenv.c //rf:ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/1.0-RELEASE/ports/shellutils/src/printenv.c

, GNU Shell Utilities 1.8 //rf:ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/i386/1.0-RELEASE/ports/shellutils/VERSION

/* printenv -- print all or part of environment
   Copyright (C) 1989, 1991 Free Software Foundation.
...

[1993]

printenv.c yang ditemukan pada kode sumber DSLinux pada tahun 2006 //rf:(Google) cache:mailman.dslinux.in-berlin.de/pipermail/dslinux-commit-dslinux.in-berlin.de/2006-August/000578. html

--- NEW FILE: printenv.c ---
/*
 * Copyright (c) 1993 by David I. Bell

[November 1993]

Versi pertama FreeBSD telah dirilis. //rf:https://en.wikipedia.org/wiki/FreeBSD

[1 september 2002]

http://git.savannah.gnu.org/cgit/coreutils.git/tree/README-package-renamed-to-coreutils

Paket fileutils, textutils, dan sh-utils GNU (lihat “Shellutils” pada 16 Juli 1991 di atas) telah digabungkan menjadi satu, yang disebut GNU coreutils.

Secara keseluruhan, env kasus penggunaan dibandingkan dengan printenv :

  1. mencetak variabel lingkungan, tetapi printenv bisa melakukan hal yang sama

  2. Nonaktifkan shell bawaan tetapi dapat dicapai dengan enable cmd juga.

  3. set variabel tetapi tidak ada gunanya karena beberapa shell sudah dapat melakukannya tanpa env , misalnya

    $ HOME=/dev HOME=/tmp USER=root /bin/bash -c “cd ~; pwd”

    /tmp

  4. #!/usr/bin/env python header, tetapi masih tidak portabel jika env tidak di /usr/bin

  5. env -i , nonaktifkan semua env. Saya merasa berguna untuk mengetahui variabel lingkungan kritis untuk program tertentu, untuk menjalankannya dari crontab . misalnya [1] Dalam mode interaktif, jalankan declare -p > /tmp/d.sh untuk menyimpan variabel atribut. [2] Dalam /tmp/test.sh , tulis:. /tmp/d.sh; eog /home/xiaobai/Pictures/1.jpg [3] Sekarang jalankan env -i bash /tmp/test.sh [4] Jika berhasil menampilkan gambar, hapus setengah dari variabel di /tmp/d.sh dan jalankan env -i bash /tmp/test.sh lagi. Jika ada yang gagal, batalkan. Ulangi langkah untuk mempersempit. [5] Akhirnya saya menemukan eog membutuhkan $DISPLAY untuk dijalankan di crontab , dan tidak ada $DBUS_SESSION_BUS_ADDRESS akan memperlambat tampilan gambar.

  6. target_PATH="$PATH:$(sudo printenv PATH)"; berguna untuk langsung menggunakan jalur root tanpa harus mengurai lebih lanjut output env atau printenv .

misalnya:

[email protected]:~$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]:~$ sudo printenv | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]:~$ sudo printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]:~$ sudo env PATH
env: ‘PATH’: No such file or directory
[email protected]:~$

Linux
  1. Apa perbedaan antara strtok_r dan strtok_s di C?

  2. Apa perbedaan antara fsck dan e2fsck?

  3. Apa perbedaan antara adduser dan useradd?

  1. Apa Perbedaan Antara Sudo Su – Dan Sudo Su —?

  2. Apa perbedaan antara `su -` dan` su --login`?

  3. Apa perbedaan antara unlink dan rm?

  1. Perbedaan Getty dan Agetty?

  2. Perbedaan Antara .exrc Dan .vimrc?

  3. Perbedaan Antara '$ . Foo' Dan '$ ./foo'??