উত্তর:
একের পরিবর্তে দুটি আদেশ হওয়ার কোনও ?তিহাসিক কারণ রয়েছে কি?
ইতিহাসের পদ্ধতি ছিল মাত্র।
printenv
বিএসডির জন্য কমান্ডের প্রথম সংস্করণ 1979 সালে লিখেছিলেন ।env
1980 সালে কমান্ড চালু করেছিল ।env
১৯৮6 সালে ইউএনআইএক্স সিস্টেম অনুসরণ করেছিল ।env
1988 সালে জিএনইউ / ইউএনআইএক্স সিস্টেম অনুসরণ করেছে ।printenv
1988 সালে বিএসডি অনুসরণ করেছে ।printenv
1989 সালে MINX / BSD অনুসরণ করেছে ।printenv
এবং env
১৯৯১ সালে।মনে রাখবেন যে "অনুসরণ করা" এর অর্থ উত্স কোডটি একই ছিল না, সম্ভবত লাইসেন্স মামলা এড়ানোর জন্য তাদের আবার লেখা হয়েছিল।
সুতরাং কেন উভয় কমান্ডের অস্তিত্বের কারণ হ'ল বিল জয় যখন printenv
সেই সময়টি লিখেছিলেন , env
এখনও বিদ্যমান নেই। 10 বছর মার্জ / সামঞ্জস্যতা এবং GNU আসার পরে, আপনি এখন একই পৃষ্ঠায় উভয় একই কমান্ড দেখতে পাচ্ছেন।
এই ইতিহাসটি নিম্নরূপে নির্দেশিত: (আমি উত্তরটি ছোট করার চেষ্টা করি এবং কেবলমাত্র এখানে 2 টি প্রয়োজনীয় উত্স কোড সরবরাহ করে, বাকিগুলি আপনি সংযুক্ত লিঙ্কগুলিতে ক্লিক করতে পারেন)
[1975 সালের পতন]
১৯ 197৫ এর শরত্কালে পৌঁছনোয় দু'জন মনোযোগবিহীন গ্র্যাজুয়েট শিক্ষার্থী, বিল জয় এবং চক হ্যালি; তারা উভয়ই নতুন সিস্টেমে তাত্ক্ষণিক আগ্রহ নিয়েছিল। প্রাথমিকভাবে তারা একটি পাস্কাল সিস্টেমে কাজ শুরু করে যা 11/70 টি মেশিন রুমের চারপাশে ঝুলন্ত অবস্থায় থম্পসন একসাথে হ্যাক করেছিল।
[1977]
জয় প্রথম বার্কলে সফটওয়্যার ডিস্ট্রিবিউশন (1BSD) সংকলন শুরু করেছিলেন, যা মার্চ 9, 1978 সালে প্রকাশিত হয়েছিল। // আরএফ: https://en.wikedia.org/wiki/Berkeley_Software_Dist वितरण
[ফেব্রুয়ারি, 1979]
1979 ("বিল জয়, ইউসিবি ফেব্রুয়ারী, 1979" দেখুন) / 1980 (দেখুন "কপিরাইট [] ="), প্রিন্টেভ সিটি // আরএফ: http://minnie.tuhs.org/cgi-bin/utree.pl? ফাইল = 2.11BSD / src / ইউসিবি / 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]
2BSD OR 3BSD // rf এ প্রকাশিত কঠিন নির্ধারণ করা কঠিন: https://en.wikedia.org/wiki/Berkeley_Software_Distribration
3BSD প্রিন্টেনভ কমান্ড 3.0 BSD এ উপস্থিত হয়েছিল। // আরএফ: http://www.freebsd.org/cgi/man.cgi?query=printenv&sektion=1#end 3.0 BSD 1979 এ প্রবর্তিত // আরএফ: http://gunkies.org/wiki/3_BSD
2BSD প্রিন্টেনভ কমান্ডটি 2BSD // rf: http://man.openbsd.org/printenv.1 এ প্রথম উপস্থিত হয়েছিল
[জুন, 1980]
ইউনিক্স রিলিজ 3.0.০ বা "ইউনিক্স সিস্টেম III" // আরএফ: ftp://pdp11.org.ru/pub/unix-archive/PDP-11/ বিতরণী / ইউএসএল / সিসিআইআইআই /
[xiaobai@xiaobai pdp11v3]$ sudo grep -rni printenv . //no such printenv exist.
[xiaobai@xiaobai 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
[xiaobai@xiaobai 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)
[xiaobai@xiaobai pdp11v3]$
[xiaobai@xiaobai 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);
}
[xiaobai@xiaobai pdp11v3]$
[1985]
বিএসডি প্রথম প্রিন্টেনভ ম্যানুয়াল // আরএফ: http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.11BSD/src/man/man1/printenv.1 কিন্তু আমি এনভিভির সাথে সম্পর্কিত ম্যানুয়ালটি পাইনি , নিকটতমটি getenv এবং এনভায়রনমেন্ট // http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.11BSD/src/man
[1986]
জিএনইউ env
// র আরএফের প্রথম সংস্করণ : ftp://ftp-archive.freebsd.org/pub/FreeBSD- আর্কিভ / সোল্ডার / রিলিজস / i386/1.0- RELEASE /port/shellutils/src/ env.c
[1987]
মিনিক্স 1 ম প্রকাশিত হয়েছে // আরএফ: https://en.wikedia.org/wiki/Andrew_S._Tanenbaum
[1988]
বিএসডি 1 ম এনভিসি // 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, 1988]
MINIX সংস্করণ 1.3 // আরএফ: https://groups.google.com/forum/#!topic/comp.os.minix/cQ8kaiq1hgI
... 32932 190 /minix/commands/printenv.c //printenv.c ইতিমধ্যে বিদ্যমান
// আরএফ: http://www.informatica.co.cr/linux/research/1990/0202.htm
[1989]
জিএনইউর প্রথম সংস্করণ, printenv
[আগস্ট 12, 1993] দেখুন।
[জুলাই 16, 1991]
"শেল্টিলস" - জিএনইউ শেল প্রোগ্রামিং ইউটিলিটিগুলি 1.0 প্রকাশিত হয়েছে // আরএফ: https://groups.google.com/forum/#!topic/gnu.announce/xpTRtuFpNQc
এই প্যাকেজের প্রোগ্রামগুলি হ'ল:
basename তারিখ dirname env expr গ্রুপ আইডি logname pathchk printenv printf, ঘুম টী বর্ণের নাম TTY whoami হ্যা সুন্দর nohup stty uname
[আগস্ট 12, 1993]
printenv.c // rf: ftp://ftp-archive.freebsd.org/pub/FreeBSD- আর্কিভ / সোল্ডার / রিলিজস / i386/1.0-RELEASE/port/ Shellutils/src/printenv.c
, জিএনইউ শেল ইউটিলিটিস ১.৮ // আরএফ: ftp://ftp-archive.freebsd.org/pub/FreeBSD- আর্কাইভ /લ્ડ- রিলেজস / i386/1.0- RELEASE /port/ Shellutils/ ভার্সন
/* printenv -- print all or part of environment
Copyright (C) 1989, 1991 Free Software Foundation.
...
[1993]
printenv.c যা 2006 এ ডিএসলিনাক্স উত্স কোডে পাওয়া গেছে // আরএফ: (গুগল) ক্যাশে: mailman.dslinux.in-berlin.de/pipermail/dslinux-commit-dslinux.in-berlin.de/2006- অগাস্ট/000578। এইচটিএমএল
--- NEW FILE: printenv.c ---
/*
* Copyright (c) 1993 by David I. Bell
[নভেম্বর 1993]
ফ্রিবিএসডি-র প্রথম সংস্করণ প্রকাশিত হয়েছিল। // আরএফ: https://en.wikedia.org/wiki/FreeBSD
[সেপ্টেম্বর 1, 2002]
http://git.savannah.gnu.org/cgit/coreutils.git/tree/README-package-renamed-to-coreutils
জিএনইউ ফাইল্টিল, টেক্সটিলস এবং এস-ইউস (উপরের 16 জুলাই 1991 এ "শেল্টিলস দেখুন") প্যাকেজগুলিকে একটিতে একীভূত করা হয়েছে, যার নাম জিএনইউ কোর্টিলস।
সামগ্রিকভাবে, env
কেসগুলির সাথে তুলনা করুন printenv
:
printenv
একই কাজ করতে পারেনenable
।কিছু শাঁস কারণে পরিবর্তনশীল কিন্তু অর্থহীন সেট ইতিমধ্যে ছাড়া এটা করতে পারেন env
, যেমন
OME হোম = / ডিভ হোম = / টিএমপি ইউএস = রুট / বিন / বাশ -c "সিডি ~; পিডব্লিউডি"
/ tmp -র পরিবর্তে
#!/usr/bin/env python
শিরোনাম, কিন্তু এখনও env
/ usr / বিন মধ্যে না পোর্টেবল
env -i
, সমস্ত env অক্ষম। নির্দিষ্ট প্রোগ্রামের থেকে এটি চালুর জন্য গুরুত্বপূর্ণ পরিবেশের ভেরিয়েবলগুলি খুঁজে বের করা আমার পক্ষে দরকারী হয়েছিল crontab
। উদাহরণস্বরূপ [1] ইন্টারেক্টিভ মোডে, declare -p > /tmp/d.sh
অ্যাট্রিবিউট ভেরিয়েবলগুলি সঞ্চয় করুন। [2] ইন /tmp/test.sh
, লিখুন: . /tmp/d.sh;
eog /home/xiaobai/Pictures/1.jpg
[3] এখন চালান env -i bash /tmp/test.sh
[4] যদি চিত্রটি প্রদর্শিত সাফল্য হয় তবে এর মধ্যে অর্ধেক ভেরিয়েবল সরিয়ে আবার /tmp/d.sh
চালান env -i bash /tmp/test.sh
again যদি কিছু ব্যর্থ হয় তবে এটিকে পূর্বাবস্থায় ফেরান। সরু হয়ে যাওয়ার জন্য ধাপটি পুনরাবৃত্তি করুন। []] পরিশেষে আমি বুঝতে পারি যে এটি চালানো eog
দরকার , এবং অনুপস্থিত চিত্রের প্রদর্শনকে কমিয়ে দেবে।$DISPLAY
crontab
$DBUS_SESSION_BUS_ADDRESS
target_PATH="$PATH:$(sudo printenv PATH)";
env
বা এর আউটপুটকে আরও পার্সিং না করে মূল পাথকে সরাসরি ব্যবহার করতে কার্যকর printenv
।
উদাহরণ:
xb@dnxb:~$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
xb@dnxb:~$ sudo printenv | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
xb@dnxb:~$ sudo printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
xb@dnxb:~$ sudo env PATH
env: ‘PATH’: No such file or directory
xb@dnxb:~$
(ফ্রিবিএসডি থেকে) ভিন্ন দৃষ্টিকোণ থাকা আপনার কাছে রয়েছে:
থেকে man env
:
The env utility executes another utility after modifying the environment
as specified on the command line. Each name=value option specifies the
setting of an environment variable, name, with a value of value. All
such environment variables are set before the utility is executed.
...
If no utility is specified, env prints out the names and values of the
variables in the environment, with one name/value pair per line.
থেকে man printenv
:
The printenv utility prints out the names and values of the variables in
the environment, with one name/value pair per line. If name is speci-
fied, only its value is printed.
সুতরাং এই আদেশগুলি আর্গুমেন্ট ছাড়াই একই প্রভাব ফেলতে পারে, তবে printenv
একমাত্র উদ্দেশ্য হ'ল বর্তমান পরিবেশ কী / মানগুলি প্রদর্শন করার সময় env
এটি অন্য বাইনারি / স্ক্রিপ্ট / যাই হোক না কেন কল করার আগে কিছু পরিবেশ নির্ধারণের লক্ষ্য।
এটি কি এইভাবে আরও পরিষ্কার হয়?
আরও জানার জন্য:
man 1 env
(FreeBSD 'র)man 1 printenv
(FreeBSD 'র)env
printenv
printenv
ম্যান-পেজ থেকে:
env - একটি পরিবর্তিত পরিবেশে একটি প্রোগ্রাম চালান
...
প্রিন্টেনভ - সমস্ত বা পরিবেশের অংশ মুদ্রণ করুন
বেশ ব্যাখ্যামূলক হওয়া উচিত।
printenv
কেবলমাত্র বর্তমান পরিবেশের সমস্ত পরিবর্তনশীল মুদ্রণ করে। সঙ্গে env
প্রয়োজন হলে আপনার কিছু পরিবর্তন সঙ্গে একই পরিবেশ প্রস্তুত এবং এটি একটি অ্যাপ্লিকেশন রান করতে পারেন।
ls
একটি বাইনারি, তবে ll
এটি একটি সাধারণ নাম, যা সাধারণত প্রসারিত হয় ls -l
। printenv
এবং env
দুটি ভিন্ন বাইনারি, আমি নিশ্চিত না যে কোনটি প্রথমে চালু হয়েছিল। আপনি আরো কিছু উদাহরণ এখানে দেখতে পাবেন gnu.org/software/coreutils/manual/html_node/env-invocation.html
কার্যকারিতা সম্পর্কে কঠোরভাবে কথা বলা, env
একটি বিশাল বৈশিষ্ট্যযুক্ত একটি বাইনারি, যার মধ্যে একটি হ'ল পরিবেশের ভেরিয়েবল printenv
প্রিন্ট করা হয় , যেখানে কেবল পরিবেশের ভেরিয়েবলগুলি মুদ্রণ করা হয়।
সংক্ষিপ্তসার হিসাবে, আপনি যদি এনভির সাথে কাজ করতে ব্যবহৃত হয়, আপনি env
সেগুলি মুদ্রণের জন্য যাবেন (কারণ এটি যা আপনি অভ্যস্ত) এবং যদি আপনি না হন তবে আপনি সাধারণত printenv
দ্রুত মনে রাখবেন ।
কেবল পরিবেশগত ভেরিয়েবলগুলি মুদ্রণের জন্য printenv
বনাম সম্পর্কে কথা বলার সময় কার্যত কোনও পার্থক্য নেই env
। আমি কেবল পরীক্ষা করে দেখেছি এবং এনভিভি কিছুটা ভারী (প্রায় 5 অতিরিক্ত কেবি), এবং তাদের সম্পাদনা (সময় মতো) ঠিক একই রকম বলে মনে হচ্ছে।
আশা করি এটি পরিষ্কার হয়ে যায়! :)
যদি আপনি সত্যিই জানতে চান যে দুটি বাইনারিগুলির ইতিহাস এবং উত্তরাধিকার নির্বিশেষে আলাদা আউটপুট কীভাবে হয় তবে আপনি এই পার্থক্যটি নির্ধারণ করতে কয়েকটি ইউটিলিটি চালাতে পারেন। ডেবিয়ানে আমি কয়েকটি জিনিস দৌড়েছিলাম যা কোনও কাস্টম পরিবেশগত ভারের উপর নির্ভর করে আলাদা হবে:
env |wc -l
printenv |wc -l
আমার আউটপুট উভয়েরই 41 টি লাইন রয়েছে
env > env.txt
printenv > printenv.txt
diff env.txt printenv.txt
আউটপুট: 41c41 <_ = / ইউএসআর / বিন / এনভি ---
: _ = / Usr / bin / printenv
সুতরাং আপনি দেখতে পাচ্ছেন যে দুটিতে একটি লাইন আলাদা এবং সেই লাইনটি 41 নম্বর যা আমি অনুমান করি যে কমান্ডটিতে ব্যবহৃত বাইনারিটি নির্ধারণ করে। অতিরিক্ত যুক্তি ছাড়াই, এইগুলি আমার জন্য ভার্চুয়াল অভিন্ন তথ্য রিপোর্ট করে।