'এনভ' এবং 'প্রিন্টেভ' এর মধ্যে পার্থক্য কী?


67

দুটি আদেশ envএবং এর মধ্যে পার্থক্য কি printenv? তারা উভয়ই পরিবেশের ভেরিয়েবলগুলি দেখায় এবং আউটপুটটি একেবারে বাদে _

একের পরিবর্তে দুটি আদেশ হওয়ার কোনও ?তিহাসিক কারণ রয়েছে কি?

উত্তর:


49

একের পরিবর্তে দুটি আদেশ হওয়ার কোনও ?তিহাসিক কারণ রয়েছে কি?

ইতিহাসের পদ্ধতি ছিল মাত্র।

  1. বিল জয় printenvবিএসডির জন্য কমান্ডের প্রথম সংস্করণ 1979 সালে লিখেছিলেন ।
  2. ইউএনআইএক্স সিস্টেম তৃতীয় env1980 সালে কমান্ড চালু করেছিল ।
  3. জিএনইউ env১৯৮6 সালে ইউএনআইএক্স সিস্টেম অনুসরণ করেছিল ।
  4. বিএসডি env1988 সালে জিএনইউ / ইউএনআইএক্স সিস্টেম অনুসরণ করেছে ।
  5. এমআইএনআইএক্স printenv1988 সালে বিএসডি অনুসরণ করেছে ।
  6. GNU printenv1989 সালে MINX / BSD অনুসরণ করেছে ।
  7. জিএনইউ শেল প্রোগ্রামিং ইউটিলিটিগুলি ১.০ অন্তর্ভুক্ত printenvএবং env১৯৯১ সালে।
  8. জিএনইউ শেল ইউটিলিটিস ২০০২ সালে জিএনইউ কোর্টিলগুলিতে একীভূত হয়েছিল, যা আজকাল জিএনইউ / লিনাক্সে আপনি সহজেই দেখতে পেতেন।

মনে রাখবেন যে "অনুসরণ করা" এর অর্থ উত্স কোডটি একই ছিল না, সম্ভবত লাইসেন্স মামলা এড়ানোর জন্য তাদের আবার লেখা হয়েছিল।

সুতরাং কেন উভয় কমান্ডের অস্তিত্বের কারণ হ'ল বিল জয় যখন 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

[জুন, 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

  • তেনেনবাউম আইবিএম পিসির জন্য ইউএনআইএক্স-এর একটি ক্লোন লিখেছিলেন, যার নাম MINIX (MINI-UNIX)। এটি ছাত্র এবং অন্যান্যদের লক্ষ্যবস্তু হয়েছিল যারা অপারেটিং সিস্টেম কীভাবে কাজ করে তা শিখতে চেয়েছিল।

[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:

  1. প্রিন্ট এনভায়রনমেন্ট ভেরিয়েবল, তবে printenvএকই কাজ করতে পারেন
  2. শেল বিল্টিন অক্ষম করুন তবে সেমিডিও দিয়ে অর্জন করতে পারেন enable
  3. কিছু শাঁস কারণে পরিবর্তনশীল কিন্তু অর্থহীন সেট ইতিমধ্যে ছাড়া এটা করতে পারেন env, যেমন

    OME হোম = / ডিভ হোম = / টিএমপি ইউএস = রুট / বিন / বাশ -c "সিডি ~; পিডব্লিউডি"

    / tmp -র পরিবর্তে

  4. #!/usr/bin/env pythonশিরোনাম, কিন্তু এখনও env/ usr / বিন মধ্যে না পোর্টেবল

  5. 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.shagain যদি কিছু ব্যর্থ হয় তবে এটিকে পূর্বাবস্থায় ফেরান। সরু হয়ে যাওয়ার জন্য ধাপটি পুনরাবৃত্তি করুন। []] পরিশেষে আমি বুঝতে পারি যে এটি চালানো eogদরকার , এবং অনুপস্থিত চিত্রের প্রদর্শনকে কমিয়ে দেবে।$DISPLAYcrontab$DBUS_SESSION_BUS_ADDRESS

  6. 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:~$

4
চমৎকার ইতিহাস পাঠ।
ওকি

21

(ফ্রিবিএসডি থেকে) ভিন্ন দৃষ্টিকোণ থাকা আপনার কাছে রয়েছে:

থেকে 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এটি অন্য বাইনারি / স্ক্রিপ্ট / যাই হোক না কেন কল করার আগে কিছু পরিবেশ নির্ধারণের লক্ষ্য।

এটি কি এইভাবে আরও পরিষ্কার হয়?

আরও জানার জন্য:


2
প্রদত্ত লিঙ্ক থেকে: কমান্ড 4.4BSD দেখা যায়। -P, -S এবং -v বিকল্পগুলি ফ্রিবিএসডি 6.0 এ যুক্ত করা হয়েছিল। কমান্ড 3.0BSD দেখা যায়। সুতরাং historicalতিহাসিক কারণটি মনে হয় এটি প্রথম আগত। env printenvprintenv
এমসিএমএলএক্সএক্সএক্সভি


3

ম্যান-পেজ থেকে:

env - একটি পরিবর্তিত পরিবেশে একটি প্রোগ্রাম চালান

...

প্রিন্টেনভ - সমস্ত বা পরিবেশের অংশ মুদ্রণ করুন

বেশ ব্যাখ্যামূলক হওয়া উচিত।


4
তবে আমি তা পাই না ...
মাইকসার্ভ

আমার ধারণা env প্রিন্টেনভের আগে এসেছিল। তাহলে কেন অন্য একটি বাইনারি করা? এটি 'll' থেকে 'ls' এর সাথে একই নয় কারণ 'll' বাইনারি নয় এবং ম্যান পৃষ্ঠা নেই।
WiSaGaN

@ মাইকজারভ printenvকেবলমাত্র বর্তমান পরিবেশের সমস্ত পরিবর্তনশীল মুদ্রণ করে। সঙ্গে envপ্রয়োজন হলে আপনার কিছু পরিবর্তন সঙ্গে একই পরিবেশ প্রস্তুত এবং এটি একটি অ্যাপ্লিকেশন রান করতে পারেন।
ইউভিভি

@ উইসাগান আপনার তুলনাটি সত্যিই সঠিক নয়। lsএকটি বাইনারি, তবে llএটি একটি সাধারণ নাম, যা সাধারণত প্রসারিত হয় ls -lprintenvএবং envদুটি ভিন্ন বাইনারি, আমি নিশ্চিত না যে কোনটি প্রথমে চালু হয়েছিল। আপনি আরো কিছু উদাহরণ এখানে দেখতে পাবেন gnu.org/software/coreutils/manual/html_node/env-invocation.html
UVV

1
@mikeserv, উপর মাউসওভার পাঠ দেখতে এই কমিক । :)
ওয়াইল্ডকার্ড

3

কার্যকারিতা সম্পর্কে কঠোরভাবে কথা বলা, envএকটি বিশাল বৈশিষ্ট্যযুক্ত একটি বাইনারি, যার মধ্যে একটি হ'ল পরিবেশের ভেরিয়েবল printenvপ্রিন্ট করা হয় , যেখানে কেবল পরিবেশের ভেরিয়েবলগুলি মুদ্রণ করা হয়।

সংক্ষিপ্তসার হিসাবে, আপনি যদি এনভির সাথে কাজ করতে ব্যবহৃত হয়, আপনি envসেগুলি মুদ্রণের জন্য যাবেন (কারণ এটি যা আপনি অভ্যস্ত) এবং যদি আপনি না হন তবে আপনি সাধারণত printenvদ্রুত মনে রাখবেন ।

কেবল পরিবেশগত ভেরিয়েবলগুলি মুদ্রণের জন্য printenvবনাম সম্পর্কে কথা বলার সময় কার্যত কোনও পার্থক্য নেই env। আমি কেবল পরীক্ষা করে দেখেছি এবং এনভিভি কিছুটা ভারী (প্রায় 5 অতিরিক্ত কেবি), এবং তাদের সম্পাদনা (সময় মতো) ঠিক একই রকম বলে মনে হচ্ছে।

আশা করি এটি পরিষ্কার হয়ে যায়! :)


-1

যদি আপনি সত্যিই জানতে চান যে দুটি বাইনারিগুলির ইতিহাস এবং উত্তরাধিকার নির্বিশেষে আলাদা আউটপুট কীভাবে হয় তবে আপনি এই পার্থক্যটি নির্ধারণ করতে কয়েকটি ইউটিলিটি চালাতে পারেন। ডেবিয়ানে আমি কয়েকটি জিনিস দৌড়েছিলাম যা কোনও কাস্টম পরিবেশগত ভারের উপর নির্ভর করে আলাদা হবে:

env |wc -l
printenv |wc -l

আমার আউটপুট উভয়েরই 41 টি লাইন রয়েছে

env > env.txt
printenv > printenv.txt
diff env.txt printenv.txt

আউটপুট: 41c41 <_ = / ইউএসআর / বিন / এনভি ---

: _ = / Usr / bin / printenv

সুতরাং আপনি দেখতে পাচ্ছেন যে দুটিতে একটি লাইন আলাদা এবং সেই লাইনটি 41 নম্বর যা আমি অনুমান করি যে কমান্ডটিতে ব্যবহৃত বাইনারিটি নির্ধারণ করে। অতিরিক্ত যুক্তি ছাড়াই, এইগুলি আমার জন্য ভার্চুয়াল অভিন্ন তথ্য রিপোর্ট করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.