পূর্ববর্তী আদেশের শেষ যুক্তিটি কী?


12

$_ পূর্ববর্তী কমান্ডের শেষ যুক্তি হিসাবে বলা হয়।

তাই আমি ভাবছি কেন তা না হয় EDITOR="emacs -nw"কিন্তু EDITORনিম্নলিখিত উদাহরণে?

কেন "emacs -nw"শেষ যুক্তির অংশ নয় ?

আরও সাধারণভাবে, একটি যুক্তির সংজ্ঞা এবং শেষ যুক্তি কী?

ধন্যবাদ।

$ export EDITOR="emacs -nw"
$ echo $_
EDITOR

3
আমি মনে করি এটি একই কারণে শেলচেক আপনাকে বলেছে যে একই লাইনে আপনি ভেরিয়েবলগুলি রপ্তানি করবেন না। অ্যাসাইনমেন্টটি ঘটে এবং তারপরে ভেরিয়েবলটি এক্সপোর্ট করা হয়। EDITORরফতানি করার জন্য একটি যুক্তি
jesse_b

এফডাব্লুআইডাব্লু, pdkshএবং dashনির্ধারিত মানটি অন্তর্ভুক্ত করবে, তবে ksh93তার মতো আচরণ করবে bash
কুসালানন্দ

zsh:, export FOO=bar; echo $_প্রিন্ট export
ilkkachu

@ জেসি_বি পুরো জিনিসটি সর্বশেষ যুক্তি / অপারেন্ড (নির্ধারিত মান সহ), তবে এটি exportএকটি বিল্ট-ইন ইউটিলিটি হ'ল এর সাথে কিছু যুক্ত থাকতে পারে ।
কুসালানন্দ

ksh: typeset -x FOO=barতারপরে echo $_প্রিন্ট করে FOOতবে বাশ declare -x FOO=bar; echo $_প্রিন্টে FOO=bar
ilkkachu

উত্তর:


13

ব্যাশ পরিবর্তনশীল বরাদ্দকরণ প্রক্রিয়া, যখন তারা আর্গুমেন্ট হিসাবে অনুমতি করছি না (এর সাথে alias, declare, export, local, readonly, এবং typeset), অন্য কিছু করার আগে (অথবা বরং এটা তাদের অন্য কিছু করার আগে চিহ্নিত - সম্প্রসারণ মান ভেরিয়েবল নির্ধারিত প্রযোজ্য)। যখন এটি শব্দ প্রসারিত হয়, অবশিষ্ট কমান্ডটি হয় export EDITOR, তাই _সেট করা থাকে EDITOR

সাধারণভাবে বলতে গেলে, আর্গুমেন্টগুলি হ'ল "শব্দ "গুলি প্রসারণের পরে অবশিষ্ট রয়েছে (যার মধ্যে পরিবর্তনশীল অ্যাসাইনমেন্ট এবং পুনঃনির্দেশগুলি অন্তর্ভুক্ত নয়)।

দেখুন সহজ কমান্ড সম্প্রসারণ বিস্তারিত জানার জন্য ব্যাশ ম্যানুয়াল।


এবং আমি বুঝতে পারি declareযে আমি যে বর্ণনা করছি তার আচরণের সাথে মেলে না ...
স্টিফেন কিট

ভাল, এটি যে খুব সামঞ্জস্যপূর্ণ না। declare a=b; echo $_প্রিন্ট a=b; export c=d; echo $_প্রিন্ট করুন caliasমনে হয় ঠিক নাম ছাপছে,localঅন্যদিকে পুরো পুরো যুক্তি মুদ্রণ করে। এবং readonlyঠিক নামটি মুদ্রণ করে, যা আমি কিছুটা অবাক করে দিয়েছি যেহেতু আমি ভাবতাম readonlyএবং এর localসাথে মিল থাকব declare
ilkkachu

1
@ ইল্ক্কাছু হে, আমিও বুঝতে পেরেছি (উপরে দেখুন)। exportএবং readonlyএকসঙ্গে ঘোষণা করা setattr.def, declare, local, এবং typesetঘোষণা করা হয়declare.def , aliasএকা বাধা হয়ে দাঁড়ায় alias.def
স্টিফেন কিট

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

ধন্যবাদ। আমি একটু বিভ্রান্ত। যখন ভেরিয়েবল অ্যাসাইনমেন্টগুলি আর্গুমেন্ট হিসাবে alias, declare, export, local, readonlyএবং ব্যবহৃত হয় typeset। প্রথম এবং পরবর্তী কি ঘটবে? "যখন এটি শব্দ প্রসারিত হয়ে যায়, অবশিষ্ট কমান্ডটি হয় export EDITOR", আপনি কি বোঝাতে চান যে পরিবর্তনশীল অ্যাসাইনমেন্টটি EDITOR="emacs -nw"প্রসারণের আগে ঘটে? যদি তা না হয় তবে কেন অবশিষ্ট কমান্ডটি যুক্তি হিসাবে অ্যাসাইনমেন্টটি ধারণ করে না? যদি হ্যাঁ, ভেরিয়েবলের কার্যভার নির্ধারণের আগে ভেরিয়েবলগুলিতে নির্ধারিত মানগুলির প্রসার ঘটে না?
টিম

4

টি এল; ডিআর: ক্ষেত্রে export FOO=bar, ব্যাশ তার অস্থায়ী পরিবেশ সৃষ্টি, সেট ডাকে FOO=barযে পরিবেশে, তারপর একটি চূড়ান্ত কমান্ড উৎপাদ export FOO। এই সময়ে, FOOশেষ যুক্তি হিসাবে নেওয়া হয়।


আহ, বহু-আপত্তিজনক $_:

($ _, একটি আন্ডারস্কোর) shell শেল প্রারম্ভকালে, পরিবেশ বা যুক্তি তালিকায় পাস করার সাথে সাথে শেল বা শেল স্ক্রিপ্টটি কার্যকর করার জন্য নিরঙ্কুশ প্যাথনামে সেট করা থাকে। এরপরে, প্রসারণের পরে পূর্ববর্তী কমান্ডের সর্বশেষ যুক্তিতে প্রসারিত হয়। প্রতিটি কমান্ড কার্যকর করা এবং সেই আদেশে রফতানি করা পরিবেশে রাখার জন্য ব্যবহৃত পুরো পথের নাম সেট করুন। মেল চেক করার সময়, এই পরামিতিটি মেল ফাইলটির নাম ধারণ করে।

আসুন কয়েকটি প্রকারভেদ দেখুন:

$ man; echo $_
What manual page do you want?
man
$ man foo; echo $_
No manual entry for foo
foo
$ echo; echo $_

echo
$ echo bar foo; echo $_
bar foo
foo
$ foo=x eval 'echo $foo'; echo $_
x
echo $foo
$ bar() { man $1; }; echo $_
foo
$ for (( i=0; $i<0; i=i+1 )); do echo $i; done; echo $_
foo
$ bar; echo $_
What manual page do you want?
man
$ bar foo; echo $_
No manual entry for foo
foo
$ MANPATH=/tmp; echo $_

$ export MANPATH=/tmp; echo $_
MANPATH

সুতরাং আমরা এখানে তিনটি নিদর্শন দেখতে পাচ্ছি:

  • ফাইল সিস্টেম, ফাংশন এবং বিল্ট-ইনগুলি থেকে প্রত্যাশিত $_কমান্ডগুলি সাধারণত প্রত্যাশিতভাবে আচরণ করে: আর্গুমেন্ট না থাকলে কমান্ডের নামেই নিজেই সেট করা হয়, অন্যথায় উপস্থাপিত আর্গুমেন্টগুলির শেষটি।
  • ফাংশন সংজ্ঞা, লুপ এবং অন্যান্য যৌক্তিক নির্মাণের পরে: $_সংশোধিত হয় না।
  • অন্য সব কিছু: $_এমন কিছুতে সেট করা হয় যা প্রত্যাশিত নয়; অদ্ভুত।

আমি অদ্ভুততার কিছুটা অন্তর্দৃষ্টি দেওয়ার জন্য কোডটি চালিত করেছি।

$ ./bash --noprofile --norc -c 'man foo'
lastword=[man]
lastarg=[foo]
$ ./bash --noprofile --norc -c 'export FOO=bar'
lastword=[export]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[bar]
before bind_lastarg, lastarg=[FOO]
bind_lastarg, arg=[FOO]
bind_variable, name=[_], value=[FOO]
$ ./bash --noprofile --norc -c 'declare FOO=bar'
lastword=[declare]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[(null)]
before bind_lastarg, lastarg=[FOO=bar]
bind_lastarg, arg=[FOO=bar]
bind_variable, name=[_], value=[FOO=bar]

আপনি যে পার্সার দেখতে পারেনlastarg= সব ক্ষেত্রেই প্রত্যাশিত শেষ যুক্তি ( ) দেখতে পাবে , কিন্তু তারপরে যা ঘটে তা নির্ভর করে যা বাশ ভাবেন তার উপর নির্ভর করে। দেখুন , execute_cmd.c execute_simple_command ()

এর ক্ষেত্রে export FOO=bar, বাশ অ্যাসাইনমেন্ট দেয় এবং তারপরে পরিবর্তনশীল রফতানি করে। এটি ডকুমেন্টেশনের দৃser়তার সাথে সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে যা বিস্তারের পরে শেষ যুক্তি গণনা করেছে।


1
শেলটি কীভাবে জানতে পারে যে আপনি মেল পরীক্ষা করছেন?
রেক্যান্ডবোনম্যান

@rackandboneman নিশ্চিত ছাড়া, আমি অভ্যন্তরীণ ভিত্তিক সম্পন্ন উপর চেক সন্দেহMAILCHECK
জেফ স্ক্যালার হলেন

2

শিরোনাম প্রশ্নের উত্তর দিতে, চেষ্টা করুন !$:

$ export EDITOR="emacs -nw"
$ echo !$
EDITOR=emacs -nw

এটি হ'ল ইতিহাস বিস্তৃতি। বাশ ম্যানপেজ থেকে:

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

...

ইভেন্ট ডিজাইনার

...

! একটি খালি, নিউলাইন, ক্যারিজ রিটার্ন, = বা ((যখন এক্সট্লোব শেল বিকল্পটি শপ্ট বিল্টিন ব্যবহার করে সক্ষম করা হবে) ব্যতীত ইতিহাসের প্রতিস্থাপন শুরু করুন।

...

!! পূর্ববর্তী কমান্ড দেখুন। এটি `! -1 'এর প্রতিশব্দ।

...

শব্দ ডিজাইনার

...

Last শেষ শব্দ। এটি সাধারণত শেষ যুক্তি, তবে লাইনে কেবল একটি শব্দ থাকলে জিরোথ শব্দে প্রসারিত হবে।

...

কোনও শব্দ ডিজাইনার যদি ইভেন্টের উল্লেখ ছাড়াই সরবরাহ করা হয় তবে পূর্ববর্তী কমান্ডটি ইভেন্ট হিসাবে ব্যবহৃত হয়।


আপনি waaaaay প্রশ্নের শিরোনাম খুব আক্ষরিকভাবে নিচ্ছেন। (ঠিক আছে, এটি একটি দুর্বল শিরোনাম)) আমরা সকলেই দেখতে পাচ্ছি যে কমান্ড command export EDITOR="emacs -nw"two দুটি শব্দ নিয়ে গঠিত: প্রথমটি « export» এবং দ্বিতীয়টি « EDITOR="emacs -nw"» » এই প্রশ্নটি সত্যিই জিজ্ঞাসা করছে, "বাশ ম্যান পৃষ্ঠা এবং বাশ ম্যানুয়াল বলতে কী বোঝায় যখন এই ক্ষেত্রে !_ব্যাশটি $_« to সেট করে , 'পূর্ববর্তী কমান্ডের সর্বশেষ যুক্তিতে প্রসারিত হবে' EDITOR? " ইতিহাসের প্রসারণে ব্যাশ ম্যান পৃষ্ঠা বিভাগটি অনুলিপি করা ও আটকে দেওয়া বিশেষভাবে কার্যকর নয়।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.