পসিক্সে কমান্ড লাইন আর্গুমেন্টের মধ্যে কোনও প্রোগ্রামের পক্ষে স্পেসের সংখ্যা পাওয়া সম্ভব?


23

আমি নিম্নলিখিত লাইনের সাথে একটি প্রোগ্রাম লিখেছি কিনা বলুন:

int main(int argc, char** argv)

এখন এটি কমান্ড লাইন আর্গুমেন্টের বিষয়বস্তু যাচাই করে কে প্রেরণ করা হবে তা তা জানে argv

প্রোগ্রামটি আর্গুমেন্টগুলির মধ্যে কতগুলি স্পেস সনাক্ত করতে পারে? আমি যখন এগুলিকে ব্যাশ টাইপ করি তখন পছন্দ করুন:

ibug@linux:~ $ ./myprog aaa bbb
ibug@linux:~ $ ./myprog       aaa      bbb

এনভায়রনমেন্ট একটি আধুনিক লিনাক্স (যেমন উবুন্টু ১ ).০৪) তবে আমি মনে করি উত্তরটি কোনও পসিক্স-কমপ্লায়েন্ট সিস্টেমে প্রয়োগ করা উচিত।


22
শুধু কৌতূহলের জন্য, আপনার প্রোগ্রামটি কেন এটি জানতে হবে?
nxnev

2
@ এনএক্সনেভ আমি কয়েকটি উইন্ডোজ প্রোগ্রাম লিখতাম এবং আমি জানি এটি সেখানে সম্ভব, তাই আমি লিনাক্স (বা ইউনিক্স) এর মতো কিছু আছে কিনা তা অবাক করি।
আইবুগ

9
আমি অস্পষ্টভাবে সিপি / এম-তে মনে করি যে প্রোগ্রামগুলি তাদের নিজস্ব কমান্ড লাইনগুলি পার্স করতে হয়েছিল - এর অর্থ প্রতিটি সি রানটাইমকে একটি শেল পার্সার প্রয়োগ করতে হয়েছিল। এবং তারা সকলেই কিছুটা ভিন্নভাবে এটি করেছে।
টবি স্পিড

3
@iBug আছে, তবে কমান্ডটি চালানোর সময় আপনার আর্গুমেন্টগুলি উদ্ধৃত করতে হবে। এটি পসিক্স (এবং অনুরূপ) শেলগুলিতে কীভাবে হয়।
কনরাড রুডল্ফ

3
@iBug, ... উইন্ডোজের একই নকশা রয়েছে যা টবি উপরের সিপি / এম থেকে উল্লেখ করেছে। ইউনিক্স যে কি না - বলা প্রক্রিয়া এর দৃষ্টিকোণ থেকে, সেখানে হয় কোন কমান্ড লাইন চলমান জড়িত।
চার্লস ডাফি

উত্তর:


39

"যুক্তিগুলির মধ্যে ফাঁক" সম্পর্কে কথা বলা অর্থবহ নয়; এটি একটি শেল ধারণা।

শেলের কাজ হ'ল ইনপুটটির সম্পূর্ণ লাইন নেওয়া এবং কমান্ড শুরু করার সাথে তাদের যুক্তির অ্যারেগুলিতে গঠন করা। এর মধ্যে উদ্ধৃত স্ট্রিংগুলি পার্সিং, ভেরিয়েবলগুলি প্রসারণ, ফাইল ওয়াইল্ডকার্ড এবং টিলড এক্সপ্রেশন এবং আরও অনেক কিছু জড়িত থাকতে পারে। কমান্ডটি একটি স্ট্যান্ডার্ড execসিস্টেম কল দিয়ে শুরু করা হয়েছিল , যা স্ট্রিংয়ের একটি ভেক্টর গ্রহণ করে।

স্ট্রিংয়ের ভেক্টর তৈরি করার জন্য অন্যান্য উপায় রয়েছে। অনেক প্রোগ্রাম পূর্বনির্ধারিত কমান্ড অনুরোধের সাথে নিজস্ব উপ-প্রক্রিয়াগুলি কাঁটাচামচ করে এবং কার্যকর করে - এই ক্ষেত্রে, "কমান্ড লাইন" এর মতো জিনিস কখনও নেই। একইভাবে, কোনও গ্রাফিকাল (ডেস্কটপ) শেলটি একটি প্রক্রিয়া শুরু করতে পারে যখন কোনও ব্যবহারকারী কোনও ফাইল আইকন টেনে নিয়ে যায় এবং কমান্ড উইজেট-এ ফেলে দেয় - আবারও "আর্গুমেন্ট" এর মধ্যে অক্ষরের অক্ষরের কোনও পাঠ্য রেখা নেই।

যতক্ষণ না অনুরোধ করা কমান্ডের সাথে সম্পর্কিত, শেল বা অন্যান্য প্যারেন্ট / পূর্ববর্তী প্রক্রিয়াতে যা ঘটে তা ব্যক্তিগত এবং গোপনীয় - আমরা কেবল স্ট্রিংগুলির অ্যারে দেখতে পাই যা স্ট্যান্ডার্ড সি নির্দিষ্ট করে যে main()গ্রহণ করতে পারে।


উত্তম উত্তর - ইউনিক্স নববিদের জন্য এটি উল্লেখ করা গুরুত্বপূর্ণ, যারা প্রায়শই ধরে tar cf texts.tar *.txtনেন যে যদি তারা চালায় তবে টার প্রোগ্রামটি দুটি যুক্তি পায় এবং দ্বিতীয়টি *.txtনিজেই প্রসারিত করতে হয়। অনেক লোক উপলব্ধি করতে পারে না যে এটি সত্যিকার অর্থে কীভাবে কাজ করে যতক্ষণ না তারা তাদের নিজস্ব স্ক্রিপ্ট / প্রোগ্রামগুলি লিখতে শুরু করে যা আর্গুমেন্টগুলি পরিচালনা করে।
লরেন্স রেনশওয়া

58

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


9
আপনি উল্লেখ করতে পারেন execve(2)
iBug

3
আপনি ঠিক বলেছেন, একজন খোঁড়া অজুহাত হিসাবে আমি বলতে পারি যে আমি বর্তমানে একটি ফোন ব্যবহার করছি এবং ম্যান পেজগুলি সন্ধান করা কিছুটা ক্লান্তিকর :-)
হ্যান্স-মার্টিন মোসনার

1
এটি পসিক্সের প্রাসঙ্গিক বিভাগ।
স্টিফেন কিট

1
@ হান্স-মার্টিনমোসনার: টার্মাক্স ...? ;-)
দেবসোলার

9
"সাধারণভাবে" বোঝানো হয়েছিল যেখানে এটি সম্ভব সেখানে একটি বিশেষ সংশ্লেষিত মামলার উদ্ধৃতি দেওয়ার বিরুদ্ধে একটি সুরক্ষাকারী হিসাবে - উদাহরণস্বরূপ, একটি স্যুইড রুট প্রক্রিয়া কলিং শেলের স্মৃতিটি পরীক্ষা করতে এবং আনসারসড কমান্ড লাইন স্ট্রিংটি সন্ধান করতে সক্ষম হতে পারে।
হ্যান্স-মার্টিন মোসনার

16

না, এটি সম্ভব নয়, যদি না ফাঁকা স্থানগুলি একটি আর্গুমেন্টের অংশ না হয় ।

কমান্ডটি অ্যারে থেকে পৃথক যুক্তিগুলি অ্যাক্সেস করে (প্রোগ্রামিং ভাষার উপর নির্ভর করে এক ফর্ম বা অন্য রূপে) এবং আসল কমান্ড লাইনটি কোনও ইতিহাসের ফাইলে সংরক্ষণ করা যেতে পারে (যদি ইতিহাসের ফাইল রয়েছে এমন একটি শেলটিতে ইন্টারেক্টিভ প্রম্পটে টাইপ করা হয়) তবে তা হয় কোনও রূপে কমান্ডটি প্রেরণ করা হয়নি।

ইউনিক্সের সমস্ত কমান্ডগুলি শেষ exec()পর্যন্ত ফাংশনগুলির একটি পরিবারের দ্বারা কার্যকর করা হয় । এগুলি কমান্ডের নাম এবং একটি তালিকা বা আর্গুমেন্টের অ্যারে নেয়। তাদের কেউ শেল প্রম্পটে টাইপ করা কমান্ড লাইন গ্রহণ করে না। system()ফাংশন আছে, কিন্তু তার স্ট্রিং যুক্তি পরে দ্বারা সঞ্চালিত হয় execve(), যা, আবার, বদলে কমান্ড লাইন স্ট্রিং আর্গুমেন্টের একটি অ্যারের লাগে।


2
@ লাইটনেসেসেসিনআরবিট আমি "যুক্তিগুলির মধ্যে ফাঁক" সম্পর্কে কিছু বিভ্রান্তি ঘটেছিল সেদিকে আমি সেখানে রেখেছি। মধ্যে উদ্ধৃতির মধ্যে শূণ্যস্থান ফেলে helloএবং worldহয় আক্ষরিক দুটি আর্গুমেন্ট মধ্যে স্পেস।
কুসালানন্দ

5
@Kusalananda - ভাল, না ... শূণ্যস্থান মধ্যে উদ্ধৃতির মধ্যে ফেলে helloএবং worldহয় আক্ষরিক তিন আর্গুমেন্ট দ্বিতীয় সরবরাহ।
জেরেমি

@ জেরেমি যেমন আমি বলেছিলাম, "যুক্তিগুলির মধ্যে" বলতে কী বোঝায় তা নিয়ে কোনও বিভ্রান্তি দেখা দিয়েছে। হ্যাঁ, যদি আপনি চান তবে অন্য দুজনের মধ্যে দ্বিতীয় যুক্তি হিসাবে ।
কুসালানন্দ

আপনার উদাহরণগুলি ভাল, এবং শিক্ষামূলক ছিল।
জেরেমি

1
ভাল, বন্ধুরা, উদাহরণগুলি বিভ্রান্তি এবং ভুল বোঝাবুঝির একটি সুস্পষ্ট উত্স ছিল। উত্তরের মান যুক্ত না হওয়ায় আমি এগুলি মুছে ফেলেছি।
কুসালানন্দ

9

সাধারণভাবে, এটি সম্ভব নয়, যেমন আরও কয়েকটি উত্তর ব্যাখ্যা করা হয়েছে।

যাইহোক, ইউনিক্স শেল হয় সাধারণ প্রোগ্রাম (এবং তারা কমান্ড লাইন ব্যাখ্যা করা হয় এবং globbing এটা অর্থাত বিস্তৃত কাজ করার আগে কমান্ড fork& execveএটা জন্য)। শেল অপারেশন সম্পর্কেbash এই ব্যাখ্যা দেখুন । আপনি নিজের শেলটি লিখতে পারেন (বা আপনি কিছু বিদ্যমান ফ্রি সফ্টওয়্যার শেল যেমন প্যানেল করতে পারেন জিএনইউ বাশ ) এবং এটি আপনার শেল হিসাবে (বা এমনকি আপনার লগইন শেল, পাসওড (5) এবং শেলগুলি (5) ) হিসাবে ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, আপনার নিজের শেল প্রোগ্রামটি কিছু পরিবেশের ভেরিয়েবলের মধ্যে সম্পূর্ণ কমান্ড লাইন স্থাপন করতে পারে ( MY_COMMAND_LINEউদাহরণস্বরূপ কল্পনা করুন ) - অথবা শেল থেকে শিশু প্রক্রিয়াতে কমান্ড লাইনটি প্রেরণ করতে অন্য কোনও ধরণের আন্তঃ প্রক্রিয়া যোগাযোগ ব্যবহার করুন ।

আপনি কেন এটি করতে চান তা আমি বুঝতে পারি না তবে আপনি শেলকে এমনভাবে আচরণ করতে কোড করতে পারেন (তবে আমি এটি না করার পরামর্শ দিই)।

BTW, একটি প্রোগ্রাম কিছু প্রোগ্রাম যা দ্বারা শুরু করা যেতে পারে না একটি শেল (কিন্তু যা না কাঁটাচামচ (2) তারপর execve (2) , বা শুধু একটি execveএকটি প্রোগ্রাম তার বর্তমান প্রক্রিয়ায় শুরু করার জন্য)। সেক্ষেত্রে কোনও কমান্ড লাইন নেই এবং আপনার প্রোগ্রামটি কোনও আদেশ ছাড়াই শুরু করা যেতে পারে ...

লক্ষ্য করুন যে কোনও শেল ইনস্টল না করে আপনার কিছু (বিশেষায়িত) লিনাক্স সিস্টেম থাকতে পারে। এটি অদ্ভুত এবং অস্বাভাবিক, তবে সম্ভব। এর পরে আপনি একটি বিশেষ লিখতে হবে Init যেমন অন্যান্য প্রোগ্রামের শুরু প্রোগ্রাম প্রয়োজন - কোনো শেল ব্যবহার না করেই কিন্তু এমনটি করা হলেও দ্বারা fork& execveসিস্টেম কল।

অপারেটিং সিস্টেমগুলিও পড়ুন : তিনটি সহজ টুকরো এবং এটি ভুলে যাবেন না যে execveকার্যত কার্যত সর্বদা একটি সিস্টেম কল থাকে (লিনাক্স-এ, সেগুলি সিস্কলগুলি তালিকাভুক্ত করা হয় (2) , এছাড়াও পরিচিতি (2) ) যা ভার্চুয়াল ঠিকানার স্থানটিকে পুনরায় নতুন করে দেয় (এবং কিছু অন্যান্য) জিনিসগুলি) প্রক্রিয়াটি করে।


এটি সেরা উত্তর। আমি ধরে নিলাম (এটি সন্ধান না করে) argv[0] প্রোগ্রামটির নাম এবং যুক্তিগুলির জন্য অবশিষ্ট উপাদানগুলি পসিক্স স্পেসিফিকেশন এবং পরিবর্তন করা যায় না। argv[-1]কমান্ড লাইনের জন্য একটি রানটাইম এনভায়রনমেন্ট নির্দিষ্ট করে দিতে পারে , আমি ধরে নিই ...
পিটার - মনিকা

না, এটা পারে না। আরও সাবধানে execveডকুমেন্টেশন পড়ুন । আপনি ব্যবহার করতে পারবেন না argv[-1], এটি ব্যবহার করা এটি অপরিজ্ঞাত আচরণ।
বেসিল স্টারিনকিভিচ

হ্যাঁ, ভাল পয়েন্ট (আমাদের একটি সিস্কেল রয়েছে এমন ইঙ্গিতটিও) - ধারণাটি কিছুটা স্বীকৃত। রানটাইমের তিনটি উপাদানই (শেল, স্টিডলিব এবং ওএস) সহযোগিতা করতে হবে। শেলটি execvepluscmdঅতিরিক্ত প্যারামিটার (বা আরজিভি কনভেনশন) সহ একটি বিশেষ নন-পসিক্স ফাংশন কল করতে হবে, সিস্কাল মূলটির জন্য একটি আর্গুমেন্ট ভেক্টর তৈরি করে যা প্রোগ্রামের নামের পয়েন্টারের আগে কমান্ড লাইনে একটি পয়েন্টার ধারণ করে, এবং তারপরে ঠিকানাটি পাস করে প্রোগ্রামটির নাম হিসাবে পয়েন্টার হিসাবে প্রোগ্রামটির argvকল করার সময় main...
পিটার - মনিকা মার্জন

শেলটি পুনরায় লেখার দরকার নেই, কেবল উদ্ধৃতি ব্যবহার করুন। এই বৈশিষ্ট্যটি বোর্ন শেল থেকে পাওয়া যায় sh। তাই নতুন নয়।
ctrl-alt-delor

উদ্ধৃতি ব্যবহার করে কমান্ড লাইন পরিবর্তন করতে হবে । এবং ওপি তা চায় না
বেসাইল স্টারিনকিভিচ

3

আপনি সর্বদা আপনার শেলকে অ্যাপ্লিকেশনগুলি বলতে শেল কোডটি কার্যকর করার ক্ষেত্রে নেতৃত্ব দেয় তা বলতে পারেন। উদাহরণস্বরূপ, হুক ব্যবহার করে পরিবেশের ভেরিয়েবলের zshসেই তথ্যটি পাস করার $SHELL_CODEমাধ্যমে preexec()( printenvউদাহরণস্বরূপ ব্যবহৃত হয়, আপনি নিজের getenv("SHELL_CODE")প্রোগ্রামে ব্যবহার করতে পারেন ):

$ preexec() export SHELL_CODE=$1
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv  SHELL_CODE
printenv  CODE
$ $(echo printenv SHELL_CODE)
$(echo printenv SHELL_CODE)
$ for i in SHELL_CODE; do printenv "$i"; done
for i in SHELL_CODE; do printenv "$i"; done
$ printenv SHELL_CODE; : other command
printenv SHELL_CODE; : other command
$ f() printenv SHELL_CODE
$ f
f

এগুলি সবাই এই printenvহিসাবে কার্যকর করা হবে:

execve("/usr/bin/printenv", ["printenv", "SHELL_CODE"], 
       ["PATH=...", ..., "SHELL_CODE=..."]);

printenvZsh কোডটি পুনরুদ্ধার করার অনুমতি দিচ্ছে printenvযা সেই যুক্তি দিয়ে কার্যকর করতে পারে। আপনি এই তথ্যটি দিয়ে কী করতে চান তা আমার কাছে পরিষ্কার নয়।

সঙ্গে bash, বৈশিষ্ট্য নিকটস্থ zshএর preexec()তার ব্যবহার করা হবে $BASH_COMMANDএকটি DEBUGফাঁদ, কিন্তু মনে রাখবেন যে bashযে rewriting (এবং বিশেষ refactors মধ্যে বিভেদক হিসাবে ব্যবহার হোয়াইটস্পেস কিছু) এবং যে প্রত্যেক প্রয়োগ (অবশ্য কিছু) কিছু স্তর আছে কমান্ড রান করুন, প্রম্পটে প্রবেশের মতো পুরো কমান্ড লাইনটি নয় ( functraceবিকল্পটিও দেখুন)।

$ trap 'export SHELL_CODE="$BASH_COMMAND"' DEBUG
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv $(echo 'SHELL_CODE')
printenv $(echo 'SHELL_CODE')
$ for i in SHELL_CODE; do printenv "$i"; done; : other command
printenv "$i"
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printf '%s\n' "$(printenv "SHELL_CODE")"
$ set -o functrace
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printenv "SHELL_CODE"
$ print${-+env  }    $(echo     'SHELL_CODE')
print${-+env  } $(echo     'SHELL_CODE')

শেল ভাষার বাক্য সিনট্যাক্সের সীমানার কিছু শূন্যস্থান কীভাবে 1 তে আটকানো হয়েছে এবং কীভাবে সম্পূর্ণ কমান্ড লাইন সর্বদা কমান্ডের কাছে যায় না তা দেখুন। সুতরাং আপনার ক্ষেত্রে সম্ভবত দরকারী নয়।

মনে রাখবেন যে আমি এই জাতীয় কাজটি করার পরামর্শ দেব না, কারণ আপনি প্রতিটি কমান্ডের প্রতি সংবেদনশীল তথ্য নীচের মত প্রকাশ করছেন:

echo very_secret | wc -c | untrustedcmd

উভয় গোপন লিক হবে wcএবং untrustedcmd

অবশ্যই, আপনি শেল বাদে অন্য ভাষার জন্য এই জাতীয় জিনিস করতে পারেন। উদাহরণস্বরূপ, সি-তে আপনি এমন কিছু ম্যাক্রোগুলি ব্যবহার করতে পারেন যা সি কোড রফতানি করে যা পরিবেশে একটি আদেশ কার্যকর করে:

#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define WRAP(x) (setenv("C_CODE", #x, 1), x)

int main(int argc, char *argv[])
{
  if (!fork()) WRAP(execlp("printenv", "printenv", "C_CODE", NULL));
  wait(NULL);
  if (!fork()) WRAP(0 + execlp("printenv",   "printenv", "C_CODE", NULL));
  wait(NULL);
  if (argc > 1 && !fork()) WRAP(execvp(argv[1], &argv[1]));
  wait(NULL);
  return 0;
}

উদাহরণ:

$ ./a.out printenv C_CODE
execlp("printenv", "printenv", "C_CODE", NULL)
0 + execlp("printenv", "printenv", "C_CODE", NULL)
execvp(argv[1], &argv[1])

বাশ মামলার মতো সি প্রাক প্রসেসর দ্বারা কীভাবে কিছু স্থান ঘনীভূত হয়েছিল তা দেখুন। বেশিরভাগ ক্ষেত্রেই সমস্ত ভাষা না থাকলে, ডিলিমিটারগুলিতে ব্যবহৃত জায়গার পরিমাণ কোনও পার্থক্য করে না, তাই সংকলক / দোভাষী এখানে তাদের সাথে কিছুটা স্বাধীনতা নিয়ে অবাক হন না not


যখন আমি এটি পরীক্ষা করছিলাম, BASH_COMMANDতখন মূল শ্বেত স্পেসকে পৃথক করে যুক্তিগুলি অন্তর্ভুক্ত ছিল না, সুতরাং এটি অপের আক্ষরিক অনুরোধের জন্য কার্যকর ছিল না। এই উত্তরের ক্ষেত্রে সেই নির্দিষ্ট ব্যবহারের ক্ষেত্রে কোনও উপায়ই অন্তর্ভুক্ত রয়েছে?
চার্লস ডফি

@ চার্লসডুফি, আমি কেবল বাশনে জেডএসের প্রিক্সেক () এর নিকটতম সমতুল্যটি নির্দেশ করতে চেয়েছিলাম (যে শেলটি ওপিটি উল্লেখ করছে) এবং উল্লেখ করেছিলাম যে এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে ব্যবহার করা যায়নি, তবে আমি সম্মত হই যে এটি ছিল না খুব পরিস্কার. সম্পাদনা দেখুন। এই উত্তরটি উত্স কোডটি কীভাবে পাস করতে হবে সে সম্পর্কে আরও জেনারেট করার উদ্দেশ্যে তৈরি করা হয়েছে (এখানে zsh / bash / C) যা কমান্ডের সাথে মৃত্যুদন্ড কার্যকর করেছিল (কার্যকর কিছু নয়, তবে আমি আশা করি যে এটি করার সময় এবং বিশেষত উদাহরণ সহ, আমি দেখিয়েছি যে এটি খুব দরকারী নয়)
স্টাফেন চেজেলাস

0

অন্যান্য উত্তরে যা অনুপস্থিত তা আমি যুক্ত করব।

না

অন্যান্য উত্তর দেখুন

হতে পারে, সাজানো

প্রোগ্রামে কিছু করা যায় না, তবে প্রোগ্রামটি চালানোর সময় শেলটিতে কিছু করা যায়।

আপনার উদ্ধৃতি ব্যবহার করা দরকার। পরিবর্তে তাই

./myprog      aaa      bbb

আপনার এইগুলির একটি করতে হবে

./myprog "     aaa      bbb"
./myprog '     aaa      bbb'

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

বিকল্প 2

স্টিডিনের মাধ্যমে ডেটা পাস করুন। কমান্ডের মধ্যে প্রচুর পরিমাণে ডেটা পাওয়ার এটি সাধারণ উপায়। যেমন

./myprog << EOF
    aaa      bbb
EOF

অথবা

./myprog
Tell me what you want to tell me:
aaaa bbb
ctrl-d

(সূক্ষ্মসূচি হ'ল প্রোগ্রাম আউটপুট)


প্রযুক্তিগতভাবে, শেল কোড: ./myprog␣"␣␣␣␣␣aaa␣␣␣␣␣␣bbb"সঞ্চালিত (সাধারণত একটি শিশু প্রক্রিয়াতে) ফাইলটি সংরক্ষণ করে ./myprogএবং এটি দুটি আর্গুমেন্ট পাস করে : ./myprogএবং ␣␣␣␣␣aaa␣␣␣␣␣␣bbb( argv[0]এবং argc[1], argc2 হচ্ছে) এবং ওপি'র হিসাবে, এই দুটি আর্গুমেন্টকে পৃথককারী স্থান কোনওভাবেই পাস করা হয় না to myprog
স্টাফেন চেজেলাস

তবে আপনি কমান্ডটি পরিবর্তন করছেন, এবং ওপি এটি পরিবর্তন করতে চায় না
বেসাইল স্টারিনকিভিচ

আপনার মন্তব্য অনুসরণ করে, আমি আবার প্রশ্নটি পড়েছি। আপনি একটি অনুমান করছেন। ওপি কোথাও বলে নি যে তারা প্রোগ্রামটি যেভাবে চালাচ্ছে তা পরিবর্তন করতে চায় না। সম্ভবত এটি সত্য, তবে তাদের এটি বলার কিছুই ছিল না। সুতরাং এই উত্তরটি তাদের প্রয়োজন হতে পারে।
ctrl-alt-delor

ওপি আর্গুমেন্টের মধ্যে ফাঁকা স্থান সম্পর্কে স্পষ্টভাবে জিজ্ঞাসা করে , ফাঁকা স্থান যুক্ত একক যুক্তির বিষয়ে নয়
বেসাইল স্টারিনকিভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.