কতটা পোর্টেবল / ডেভ / স্টিডিন, / ডেভ / স্টাডআউট এবং / ডেভ / স্ট্ডার?


55

মাঝেমধ্যে আমি প্রমিত IO প্রবাহের এক (এর "সমতুল্য পথ" একটি নির্দিষ্ট করতে হবে stdin, stdout, stderr)। আমি লিনাক্সের সাথে কাজ করার 99% সময় থেকে, আমি স্রেফ ইত্যাদি গ্রহণের /dev/জন্য আগে থেকে প্রস্তুত করে রেখেছি /dev/stdinএবং এটি " সঠিক জিনিসটি করায় বলে মনে হচ্ছে "। তবে, একটি বিষয় হিসাবে, আমি সর্বদা এ জাতীয় যুক্তি সম্পর্কে অস্বস্তি বোধ করি (কারণ অবশ্যই এটি "কাজ করে বলে মনে হয়" যতক্ষণ না এটি হয়)। তদুপরি, এই কৌশলটি কীভাবে বহনযোগ্য। এটি সম্পর্কে আমার কোনও ভাল ধারণা নেই।

সুতরাং আমার কয়েকটি প্রশ্ন আছে:

  1. Linux- র প্রসঙ্গে, এটি নিরাপদ (হ্যাঁ / না) সমার্থক stdin, stdoutএবং stderrসঙ্গে /dev/stdin, /dev/stdoutএবং /dev/stderr?

  2. আরও সাধারণভাবে, এই সমতুল্যতা কি "পর্যাপ্ত পরিমাণে বহনযোগ্য "?

আমি কোনও পসিক্স রেফারেন্স পাইনি।



উত্তর:


36

এটি লিনাক্সের পূর্ববর্তী ইতিহাসে পাওয়া যায় into এটি পসিক্স নয় , যদিও অনেকগুলি আসল শেল (এটিএন্ডটি সহ kshএবং এটি bash) ওএসে উপস্থিত না থাকলে এটি অনুকরণ করবে; নোট করুন যে এই সিমুলেশনটি কেবল শেল স্তরে কাজ করে (যেমন পুনঃনির্দেশ বা কমান্ড লাইন প্যারামিটার, উদাহরণ হিসাবে স্পষ্ট যুক্তি হিসাবে নয় open())। এটি বলেছিল যে এটি বেশিরভাগ বাণিজ্যিক ইউনিক্স সিস্টেমে একরকম বা অন্য কোনও উপায়ে পাওয়া উচিত (কখনও কখনও এটি /dev/fd/Nবিভিন্ন পূর্ণসংখ্যার জন্য বানানযুক্ত N, তবে এটির বেশিরভাগ সিস্টেমে লিনাক্স এবং * বিএসডি হিসাবে সিমলিংক সরবরাহ করবে)।


13
প্রকৃতপক্ষে, POSIX.1-2008 স্ট্যান্ডার্ডের /dev/std{in,out,err}অংশ না হিসাবে বিশেষভাবে তালিকাভুক্ত রয়েছে ।
jw013

এটি প্রদর্শিত হয় যে আরআরডি ( git.razvi.ro/… ) এ ashসমর্থন করে না/dev/stdout
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই: এটি কোনও / দেব / স্টাডাউট নয় যা শেল দ্বারা পরিচালিত হতে পারে, এবং আপনি আরআরআরডি কী আশা করেছিলেন? এটিকে ব্যবহারিকর চেয়ে ছোট করার জন্য এটি বেশিরভাগ কৌতূহল অনুভব করছে।
জোশুয়া

22

/dev/std{in,out,err}ফাইল স্বাভাবিকভাবে শুধু symlinks হয় /proc/self/fd/{0,1,2}(যথাক্রমে)। যেমন POSIX সংজ্ঞায়িত পদ্ধতি ব্যবহার করে কিছুই লাভ হয়নি।

আপনি যদি পসিক্স অনুগত হতে চান তবে এটির সর্বোত্তম উপায় হ'ল আউটপুট পুনঃনির্দেশ ব্যবহার করা। শেল আউটপুট পুনঃনির্দেশকে POSIX স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয় । অতিরিক্তভাবে STDIN, STDOUT, STDERR ফাইল বর্ণনাকারী নম্বরগুলিও POSIX এর অংশ ।
সংক্ষেপে, এর মতো কাজগুলি >&2কাজের গ্যারান্টিযুক্ত।

তবে একটি গুরুত্বপূর্ণ বিষয় লক্ষনীয় যে এসটিডিএন, এসটিডিআউট এবং এসটিডিআরআর ব্যবহার প্রোগ্রামটি কীভাবে শুরু হয়েছিল তার বিষয়ভিত্তিক। প্রোগ্রামটি যদি ফাইল বর্ণনাকারী 1 দিয়ে কোনও ফাইলের ওপেন হ্যান্ডেল হিসাবে শুরু করা হয়, তবে আপনার প্রোগ্রামটি কেবল এটি গ্রহণ করতে হবে। এমনকি যদি আপনার প্রোগ্রামটি খোলা থাকে তবে /dev/stdoutএটির যা যা হবে তা হ'ল ফাইল বিবরণী 1 খুলতে হবে যা এখনও সেই ফাইলটির দিকে নির্দেশ করে।
আপনি যদি এটি ঘুরে দেখার চেষ্টা করছেন তবে আপনাকে সরাসরি টিটিওয়াই খুলতে হবে। সাধারণত, কোনও পুনর্নির্দেশ চলমান ছাড়াই, STDIN, STDOUT, এবং STDERR হ'ল কেবলমাত্র টিটিওয়াইয়ের দিকে ইঙ্গিত করে খালি ফাইল বর্ণনাকারী। এটির চেয়ে একেবারে আর কিছুই নেই।


2
+1, বিশেষত "একটি গুরুত্বপূর্ণ বিষয়" অংশের জন্য; আমি এটি অংশগুলিতে হজম করতে যাচ্ছি :)
অ্যালোস মাহডাল

4
বলি ব্যাপারডা কী যদি /proc/self/fd/1বা /dev/fd/1POSIX অংশ?
স্টিভেন পেনি

/dev/std???/proc/self/fdলিনাক্সে কেবলমাত্র প্রতীকগুলি ।
স্টাফেন চেজেলাস 26'17

5

পসিক্স 7 বলেছেন যে তারা এক্সটেনশন।

বেস সংজ্ঞা , বিভাগ 2.1.1 প্রয়োজনীয়তা:

সিস্টেমটি অ-মানক এক্সটেনশন সরবরাহ করতে পারে। এগুলি POSIX.1-2-2008 দ্বারা প্রয়োজনীয় বৈশিষ্ট্য নয় এবং এতে অন্তর্ভুক্ত থাকতে পারে তবে সীমাবদ্ধ নয়:

[...]

  • বিশেষ বৈশিষ্ট্য সঙ্গে অতিরিক্ত অক্ষর বিশেষ ফাইল (উদাহরণস্বরূপ,  /dev/stdin,  /dev/stdout, এবং  /dev/stderr)

পসিক্স এইচটিএমএল গ্রেপ করে পাওয়া গেছে: পসিক্স সি এপিআই ফাংশনগুলির তালিকা কোথায়?

বেশ অদ্ভুতভাবে, uuencodeসরঞ্জামটি একটি যাদু প্রভাব দেয়/dev/stdout :

এর একটি ডিকোড_পথনম অপারেন্ড নির্দিষ্ট /dev/stdout করে নির্দেশ করবে যে ইউডিকোড স্ট্যান্ডার্ড আউটপুট ব্যবহার করবে to

লিনাক্স কার্নেল ডকুমেন্টেশন বলে যে সমস্ত সিস্টেমে এটি থাকা উচিত।

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst

Compulsory links
These links should exist on all systems:
/dev/fd       /proc/self/fd   symbolic   File descriptors
/dev/stdin    fd/0            symbolic   stdin file descriptor
/dev/stdout   fd/1            symbolic   stdout file descriptor
/dev/stderr   fd/2            symbolic   stderr file descriptor

তবে, কার্নেলের মধ্যে those টি প্রতিলিঙ্কগুলি কোথায় তৈরি হয়েছে তা খুঁজে পাইনি (ডিস্ট্রো সরবরাহ করা হয়েছে?)।


1

এই প্ল্যাটফর্মগুলিতে বাশ-এ / dev / {stdout, stdin, stderr} কাজ:

Linux debian-ppc 3.16.0-4-powerpc #1 Debian 3.16.7-ckt25-1 (2016-03-06) ppc GNU/Linux
HP-UX hpux-ia6 B.11.31 U ia64 0107668277 unlimited-user license
AIX aix7 1 7 000ACFDE4C00
FreeBSD freebsd.polarhome.com 10.0-RELEASE-p7 FreeBSD 10.0-RELEASE-p7 #0: Tue Jul  8 06:37:44 UTC 2014     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
HP-UX hpux64 B.11.11 U 9000/785 2000587908 unlimited-user license
Darwin macosx 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:26:45 PDT 2012; root:xnu-1699.32.7~1/RELEASE_I386 i386
GNU hurd 0.7 GNU-Mach 1.6-486/Hurd-0.7 i686-AT386 GNU
Linux mandriva.polarhome.com 2.6.33.7-desktop-2mnb #1 SMP Mon Sep 20 18:19:20 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux
SunOS openindiana 5.11 oi_148 i86pc i386 i86pc
MirBSD miros.polarhome.com 10 Kv#10uAF-20110818 GENERIC#1330 i386
Linux pidora 3.12.23-2.20140626git25673c3.rpfr20.armv6hl.bcm2708 #1 PREEMPT Fri Jul 4 16:06:10 EDT 2014 armv6l armv6l armv6l GNU/Linux
QNX qnx 6.5.0 2010/07/09-14:44:03EDT x86pc x86
NetBSD netbsd.polarhome.com 6.1.3 NetBSD 6.1.3 (GENERIC) i386
OpenBSD openbsd.polarhome.com 4.9 GENERIC#671 i386
Linux raspbian 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
SCO_SV scosysv 5 6.0.0 i386
Linux redhat.polarhome.com 3.17.4-301.fc21.x86_64 #1 SMP Thu Nov 27 19:09:10 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
SunOS solaris-x86 5.11 11.3 i86pc i386 i86pc
Linux suse 3.4.63-2.44-desktop #1 SMP PREEMPT Wed Oct 2 11:18:32 UTC 2013 (d91a619) x86_64 x86_64 x86_64 GNU/Linux
SunOS solaris 5.10 Generic_147147-26 sun4u sparc SUNW,Sun-Fire-V210
Linux ubuntu 3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
UnixWare unixware 5 7.1.4 i386 x86at SCO UNIX_SVR5
OSF1 tru64.polarhome.com V5.1 2650 alpha
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux

তবে এগুলিতে csh এ ব্যর্থ হয়:

HP-UX hpux-ia6 B.11.31 U ia64 0107668277 unlimited-user license
Linux centos.polarhome.com 2.6.18-409.el5 #1 SMP Tue Mar 15 18:13:50 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
HP-UX hpux64 B.11.11 U 9000/785 2000587908 unlimited-user license
AIX aix7 1 7 000ACFDE4C00
SCO_SV scosysv 5 6.0.0 i386
SunOS solaris-x86 5.11 11.3 i86pc i386 i86pc
SunOS openindiana 5.11 oi_148 i86pc i386 i86pc
SunOS solaris 5.10 Generic_147147-26 sun4u sparc SUNW,Sun-Fire-V210
UnixWare unixware 5 7.1.4 i386 x86at SCO UNIX_SVR5
OSF1 tru64.polarhome.com V5.1 2650 alpha

6
আপনার পরীক্ষার কেসটি কী ছিল? bashএটি বিশেষ যেহেতু এটি নেই /dev/fd/xএমন সিস্টেমে পুনর্নির্দেশগুলির জন্য নিজেই হ্যান্ডেল করার জন্য সংকলিত হতে পারে/dev/fd
স্টাফেন চ্যাজেলাস

@ স্টাফেইন চেজেলাসকে আমি কেবলমাত্র এই কারণেই অস্বীকার করেছি যে আমি এই স্পষ্টতা ছাড়াই এটিকে বিভ্রান্তিকর হতে দেখছি (ওলে কোনও অপরাধ নয়)।
ইভান ক্যারল

0

/dev/stdoutবন্ধুদের সাথে একটি সমস্যা হ'ল নির্দিষ্ট পরিস্থিতিতে আপনার কাছে তাদের লেখার অনুমতি নাও থাকতে পারে। উদাহরণস্বরূপ, নিক্স থেকে স্ক্রিপ্টগুলি চাওয়ার সময় আমি এর মুখোমুখি হয়েছি এবং আমি অনুরূপ সরঞ্জামগুলি কল্পনা করেছি যা জেল / স্যান্ডবক্স / পাত্রে / ভিএম / ইত্যাদিতে স্ক্রিপ্টগুলি চালায়। অনুরূপ সমস্যা সম্মুখীন হতে পারে।

1>&2এই ক্ষেত্রে যেমন কাজ করেছে সিনট্যাক্স ব্যবহার করে এবং যেহেতু আমি জানতাম যে আমি ব্যাশে চালাচ্ছি, আমি ফাইলের নাম প্রত্যাশাকারী আদেশগুলির জন্য প্রক্রিয়া বিকল্প ব্যবহার করতে পারি ।

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