অবস্থানগত পরামিতি সহ বাশ-সি


15

সাধারণত, $0কোনও স্ক্রিপ্টে স্ক্রিপ্টের নাম সেট করা থাকে বা যা (পথ সহ) হিসাবে ডাকা হত to যাইহোক, যদি আমি ব্যবহার bashসঙ্গে -cবিকল্প, $0আর্গুমেন্ট কমান্ড স্ট্রিং পরে গৃহীত প্রথম সেট করা হয়:

bash -c 'echo $0 ' foo bar 
# foo 

বাস্তবে, দেখে মনে হচ্ছে অবস্থানগত পরামিতিগুলি স্থানান্তরিত হয়েছে তবে এতে অন্তর্ভুক্ত রয়েছে $0। তবে shiftকমান্ডের স্ট্রিং $0(সাধারণ হিসাবে) প্রভাবিত করে না :

bash -c 'echo $0; shift; echo $0 ' foo bar
# foo
# foo

কমান্ড স্ট্রিংয়ের জন্য কেন এই দৃশ্যত অদ্ভুত আচরণ? নোট করুন যে আমি এইরকম বিজোড় আচরণ বাস্তবায়নের পিছনে যুক্তি, যুক্তি খুঁজছি।


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


একটি পার্শ্ব নোট হিসেবে আমি ব্যবহার দেখেছি -জন্য $0একটি বাগ্ধারা মধ্যে মত যুক্তি sh -c 'foo $1 $2' - a b। এইভাবে এটি দেখতে খুব স্বাভাবিক দেখাচ্ছে (একবার আপনি এটির -অর্থ কী তা বুঝতে
পেরেছিলেন

আপনি echo 'echo the other side of this pipe globs "$@"' | sh -s -- *, দুর্ভাগ্যক্রমে, ট্রাম বিকল্পের $0সাথে কোনও -sস্থায়ী প্যারামিটারও না ... এটি xargsসাধারণত একইভাবে ব্যবহার করা যেতে পারে , যদিও এটি সাধারণত generally এবং অন্যদের ছাড়াও।
মাইকজার্ভ

@ ভোলকারসিগেল আরও সাধারণ হতে পারত --, তবে এর কিছু অন্যান্য প্রোগ্রামে দেখা যায় 'এখান থেকে যুক্তি শুরু হয়' এর সাধারণ ব্যাখ্যা পাওয়া যেত । তারপরে আবার, এটি অবিচলিতদের বিভ্রান্ত হতে পারে -cভাবতে ভাবতে --আসলে এর ব্যাখ্যা নেই।
মুরু

উত্তর:


10

এটি আপনাকে $0একটি ইনলাইন স্ক্রিপ্ট ব্যবহার করার সময় সেট / চয়ন করার সুযোগ দেয় । অন্যথায়, $0ঠিক হবে bash

তারপরে আপনি উদাহরণস্বরূপ করতে পারেন:

$ bash -c 'wc -c < "${1?}"' getlength foo
4
$ bash -c 'wc -c < "${1?}"' getlength bar
getlength: bar: No such file or directory
$ bash -c 'wc -c < "${1?}"' getlength
getlength: 1: parameter null or not set

সমস্ত শেল এটি করত না। বোর্ন শেল করেছে। কর্ন (এবং অ্যালকুইস্ট) শেলটি $1তার পরিবর্তে প্রথম প্যারামিটারে যেতে বেছে নিয়েছে । পসিক্স অবশেষে বোর্ন পথে চলে গেল, সুতরাং kshএবং ashডেরিভেটিভগুলি পরে তা ফিরে গিয়েছিল (আরও এটিতে http://www.in-ulm.de/~mascheck/various/find/#shell এ )। এর অর্থ এই যে দীর্ঘকাল ধরে sh(যা সিস্টেমের উপর নির্ভর করে বোর্ন, অ্যালকুইস্ট বা কর্ন শেলের উপর ভিত্তি করে), আপনি জানেন না যে প্রথম যুক্তিটি প্রবেশ করেছে $0বা $1, সুতরাং বহনযোগ্যতার জন্য আপনাকে এই জাতীয় কাজগুলি করতে হয়েছিল:

sh -c 'echo foo in "$1"' foo foo

বা:

sh -c 'shift "$2"; echo txt files are "$@"' tentative-arg0 3 2 *.txt

ধন্যবাদ, $0পসিক্স প্রথম যুক্তিটি যেখানে নতুন আচরণ সুনির্দিষ্ট করেছে , তাই আমরা এখন বহনযোগ্যভাবে করতে পারি:

sh -c 'echo txt files are "$@"' meaningful-arg0-for-error *.txt

আমি শুধু দৌড়ে: bash -c 'echo txt files are "$@"' meaningful-arg0-for-error *.txtউবুন্টু 14.04, ব্যাশ উপর version 4.3.11(1)-release, এবং আমি পেয়েছিলাম: txt files are *.txt। ওও
মুরু

2
@ মুরু, যা সঠিক (এবং সম্ভবত আপনার txtবর্তমান ডিরেক্টরিতে ফাইল নেই)। আরও দেখুনbash -c 'echo "${1?}"' foo
স্টাফেন চেজেলাস

অই হ্যাঁ. এটি ব্যবহারিকভাবে কার্যকর উদাহরণ।
মুড়ু

1
sh -c 'shift "$2"; echo txt files are "$@"' tentative-arg0 3 2 *.txtচমত্কারভাবে উদ্ভাবক!
ইরুভর

অথবা আপনি সম্পূর্ণ দৃ rob়তার সাথে কাজ করেছেন (কম্প.উনিক্স.শেল-এ স্টাফেন চ্যাজেলাস দ্বারা প্রস্তাবিত) SHELL -c 'shift $1; command' 2 1 arg1 arg2 ... হা হা ...
মাইকজার্ভ

3

এই আচরণটি পসিএক্স দ্বারা সংজ্ঞায়িত করা হয় :

sh -c কমান্ড_নাম [যুক্তি ...]

কমান্ড_স্ট্রিং অপারেন্ড থেকে কমান্ড পড়ুন। কমান্ড_নেম অপারেন্ডের মান এবং অবস্থানগত প্যারামিটারগুলি ($ 1, $ 2, এবং তাই) বাকি আর্গুমেন্ট অপারেশনগুলির ক্রমানুসারে বিশেষ প্যারামিটার 0 ( বিশেষ প্যারামিটারগুলি দেখুন ) সেট করুন ।

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

এটি প্রোগ্রামের যুক্তিগুলি কীভাবে সাধারণভাবে কাজ করে তার সাথে সামঞ্জস্যপূর্ণ: এটি শেষ পর্যন্ত একটি execকার্যকারিতা কল করতে নেমে আসে , যেখানে প্রথম প্রদত্ত যুক্তিটিও হয় $0এবং সমানভাবে সাধারণভাবে সেই যুক্তিটি আপনি চালিয়ে যাচ্ছেন ঠিক একই রকম হয়। কখনও কখনও, যদিও আপনি সেখানে একটি বিশেষ মান চান এবং এটি পাওয়ার অন্য কোনও উপায় নেই be যুক্তিটি উপস্থিত রয়েছে তা প্রদত্ত, এটিতে কোনও কিছুতে মানচিত্র তৈরি করতে হবে এবং ব্যবহারকারীর সেটি কী সেট করতে সক্ষম হতে হবে।

এই ধারাবাহিকতা (এবং সম্ভবত historicalতিহাসিক দুর্ঘটনা) আপনি যে পরিস্থিতি সন্ধান করছেন তাতে বাড়ে।


আপনি কি দ্বিতীয় প্যারার (আশাবাদী বাস্তব-জগতের) উদাহরণ দিতে পারেন?
মুড়ু

সঙ্গে সাদৃশ্য সঙ্গে যত্নশীল argv[0]$0শুধুমাত্র সেট করা হয় argv[0]প্রেরণ execve()যখন এটি মত shবা bash। স্ক্রিপ্টগুলির $0জন্য, অনুবাদকের কাছে আর্গুমেন্ট 1, 2 ... হিসাবে দেওয়া পথটিতে সেট করা হয়েছে (এবং সরাসরি সম্পাদিত স্ক্রিপ্টগুলির জন্য, এটি কার্যকর করার জন্য প্রথম পাথ আর্গুমেন্ট থেকে আসে) ())।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.