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.
- Bill Joy menulis versi pertama
printenv
perintah pada tahun 1979 untuk BSD. - Sistem UNIX III memperkenalkan
env
perintah pada tahun 1980. - GNU mengikuti
env
Sistem UNIX pada tahun 1986. - BSD mengikuti
env
Sistem GNU/UNIX pada tahun 1988. - MINIX mengikuti
printenv
BSD pada tahun 1988. - GNU mengikuti
printenv
MINX/BSD pada tahun 1989. - Utilitas pemrograman shell GNU 1.0 termasuk
printenv
danenv
pada tahun 1991. - 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
:
-
mencetak variabel lingkungan, tetapi
printenv
bisa melakukan hal yang sama -
Nonaktifkan shell bawaan tetapi dapat dicapai dengan
enable
cmd juga. -
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
-
#!/usr/bin/env python
header, tetapi masih tidak portabel jikaenv
tidak di /usr/bin -
env -i
, nonaktifkan semua env. Saya merasa berguna untuk mengetahui variabel lingkungan kritis untuk program tertentu, untuk menjalankannya daricrontab
. misalnya [1] Dalam mode interaktif, jalankandeclare -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 jalankanenv -i bash /tmp/test.sh
[4] Jika berhasil menampilkan gambar, hapus setengah dari variabel di/tmp/d.sh
dan jalankanenv -i bash /tmp/test.sh
lagi. Jika ada yang gagal, batalkan. Ulangi langkah untuk mempersempit. [5] Akhirnya saya menemukaneog
membutuhkan$DISPLAY
untuk dijalankan dicrontab
, dan tidak ada$DBUS_SESSION_BUS_ADDRESS
akan memperlambat tampilan gambar. -
target_PATH="$PATH:$(sudo printenv PATH)";
berguna untuk langsung menggunakan jalur root tanpa harus mengurai lebih lanjut outputenv
atauprintenv
.
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]:~$