মউকে কীভাবে নিজের স্ক্রিপ্টের নাম মুদ্রণ করবেন?


13

ব্যাশে $0স্ক্রিপ্টের নাম রয়েছে, কিন্তু awk আমি নিম্নলিখিত সামগ্রী সহ একটি স্ক্রিপ্ট নামে myscript.awk করতে যদি:

#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }

এবং এটি চালান, এটি কেবল "awk" মুদ্রণ করবে। তদুপরি, আইআরজিভি [i] আই> 0 সহ কেবল কমান্ড লাইনে স্ক্রিপ্ট আর্গুমেন্টের জন্য ব্যবহৃত হয়। সুতরাং, কীভাবে এটি স্ক্রিপ্টের নাম মুদ্রণ করবেন, এই ক্ষেত্রে "myscript.awk"?


আমি শিরোনামটি awk থেকে mawk এ পরিবর্তন করেছি কারণ সমস্ত সমাধানগুলিতে গাক প্রয়োজন এবং সাধারণ awk এর সাথে কাজ করে না, এবং বিশেষত মওক দিয়ে যা ব্যাপকভাবে ব্যবহৃত হয় (যেমন উবুন্টুতে ডিফল্ট)
cipper

আপনাকে কী mawkভাবায় উবুন্টুতে ডিফল্ট? আমার 15,04 VM- র উপর ডিফল্ট awkহয় gawk। মওক ইনস্টল করার সময় এটি ডিফল্ট নয়।
টেরডন

1
আপনি যদি এটিকে কল করেন তবে এটি একটি অজানা স্ক্রিপ্ট awk -f myscript.awk। তবে এটি প্রশ্নের সাথে সম্পর্কিত নয়।
cipper

1
@ এডমার্টন এটি একটি awkস্ক্রিপ্ট কারণ এটি শুরু হয় #!/usr/bin/awk -f। শেল স্ক্রিপ্টগুলি #!/bin/sh(বা অনুরূপ কিছু) দিয়ে শুরু হয় ।
বার্মার

1
আমি বিভিন্ন শেল বিশেষজ্ঞের সাথে কথা বলছি এবং এটি শেল বা অ্যাওড স্ক্রিপ্ট কিনা এবং এরপরে আশ্চর্যজনকভাবে পসিক্স অনুসারে ফাইলগুলির ব্যাখ্যা যা # দিয়ে শুরু হয় তার একটি নির্দিষ্ট উত্তর পাওয়ার চেষ্টা করছি! অপরিজ্ঞাত এবং কোনও নির্দিষ্ট ধরণের নাম নেই। যদিও কিছু লোক এটিকে শেল বা অ্যাওজ স্ক্রিপ্টের পরিবর্তে "হ্যাশ ব্যাং ইন্টারপ্রেটার স্ক্রিপ্ট" হিসাবে উল্লেখ করে, theক্যমত্য বলে মনে হয় যে এটি কার্নেল (শেল নয়) প্রথম লাইনটিকে ব্যাখ্যা করলেও এটি একটি এডকে স্ক্রিপ্ট হিসাবে বিবেচনা করা উচিত সেই প্রথম লাইনটিও পার্স করতে সক্ষম হতে হবে (একটি মন্তব্য হিসাবে) এবং আপনি এটি ব্যবহার করে কার্যকর করতে পারেন awk -f file
এড মর্টন

উত্তর:


5

জিএনইউ সিকউইনের উপর বাশে 4.1.3 এর সাথে জড়িত:

$ cat tst.sh
#!/bin/awk -f
BEGIN { print "Executing:", ENVIRON["_"] }

$ ./tst.sh
Executing: ./tst.sh

আমি জানি না যে এটি কতটা পোর্টেবল। যদিও সর্বদা, যদিও, আমি শেল স্ক্রিপ্টে একটি শেবাং ব্যবহার করে একটি অর্ডিক স্ক্রিপ্ট কার্যকর করব না কারণ এটি আপনাকে সম্ভাব্য কার্যকারিতাটি কেবল ছিনিয়ে নিয়েছে। এটি সহজ রাখুন এবং পরিবর্তে এটি করুন:

$ cat tst2.sh
awk -v cmd="$0" '
BEGIN { print "Executing:", cmd }
' "$@"

$ ./tst2.sh
Executing: ./tst2.sh

শেষটি যে কোনও প্ল্যাটফর্মের যে কোনও শেলের যেকোন আধুনিক অ্যাডকের সাথে কাজ করবে।


মনে রাখবেন যে প্রথমটি কেবল বাশ, zsh বা ksh এ কাজ করে। পরেরটি শেল স্ক্রিপ্ট সম্পর্কে, অ্যাজ্ক স্ক্রিপ্ট নয়।
cuonglm

2
ধন্যবাদ! ENVIRON["_"]নিখুঁতভাবে কাজ করে এবং এটি কোনও বাহ্যিক প্রোগ্রামকে কল করে না। দ্বিতীয় বিকল্পটি awk -v ...কীভাবে স্ক্রিপ্ট চালায় তার উপর নির্ভর করে; আমি এটা চাই না।
cipper

1
আপনার স্ক্রিপ্টকে কল tst.shকরা বিভ্রান্তিকর। এটি একটি awkস্ক্রিপ্ট, শেল স্ক্রিপ্ট নয়। BEGINকোনও বৈধ শেল কমান্ড নয়।
বার্মার

1
ঠিক আছে তবে পোর্টেবিলিটি প্রশ্নটি "এনভিরন নয় [] পোর্টেবল" এটি " ENVIRON["_"]প্রতিটি শেল থেকে শেবাংের মাধ্যমে ডাকা প্রতিটি অজক থেকে মুদ্রিত হলে কলিং শেল স্ক্রিপ্ট পথ তৈরি করে"? আমি কখনই কোনও শেবাং থেকে একটি অজস স্ক্রিপ্ট কল করবো না আমি ব্যক্তিগতভাবে উত্তরটির বিষয়ে চিন্তা করি না তবে কেবল ভেবেছিলাম আমি এটি উল্লেখ করেছি .... ওহ আমি উপরের মন্তব্যে দেখেছি যে @ কোংলম উত্তর দিয়েছে যে এটি কেবল কয়েকটি শেলগুলিতে সমর্থিত ।
এড মর্টন

1
ভাল পয়েন্ট, @ এড। ড্যাশ ব্যর্থ হিসাবে যাচাই করা হয়েছে (যা পূর্ববর্তী কমান্ডটি উপস্থিত করে (বা অন্যথায় শেল নিজেই দেয়) বর্তমানের চেয়ে) than ksh93 আকর্ষণীয়ভাবে পি.আই.ডি.কে গ্রাহ্যরূপে উপস্থাপিত করে, যেমন *12345*/tmp/test.awkARGV[0]নির্ভরযোগ্যভাবে সর্বদা awkড্যাশ, ব্যাশ, zsh এবং ksh93 এ থাকে।
অ্যাডাম কাটজ

5

gawk ডকুমেন্টেশন অনুযায়ী এটি সম্ভব বলে আমি মনে করি না :

অবশেষে, ARGV[0](অপারেটিং সিস্টেমের 7.5 অন্তর্নির্মিত ভেরিয়েবলগুলি দেখুন) এর মান পৃথক হয়। কিছু সিস্টেম awkসেখানে রেখে দেয়, কেউ কেউ বিশ্রী (যেমন /bin/awk) এর পুরো পথের নাম রাখে এবং কিছু আপনার স্ক্রিপ্টের নাম দেয় ('পরামর্শ')। ARGV[0]আপনার স্ক্রিপ্টের নাম দেওয়ার মানটির উপর নির্ভর করবেন না ।

উপর linuxআপনি একটি মলিন হ্যাক এক ধরনের ব্যবহার করার চেষ্টা করতে পারেন এবং দ্বারা মন্তব্য উল্লেখ Stéphane Chazelas এটা সম্ভব হলে বাস্তবায়নের awkসমর্থন NUL বাইট:

#!/usr/bin/awk -f

BEGIN { getline t < "/proc/self/cmdline"; split(t, a, "\0"); print a[3]; }

আপনার স্ক্রিপ্টটি কাজ করছে বলে মনে হচ্ছে। এটি "awk -f স্ক্রিপ্ট.ওক" দিয়ে ডাকা হলে "কে" প্রিন্ট করে এবং "./script.awk" দ্বারা ডাকলে "s" মুদ্রণ করে
সিপার

@ এসিপার: এখানে এটি সাথে কাজ করে gawkএবং ব্যর্থ হয় (আপনার বিবরণের মতো) mawk। মজাদার!

এটি আমার জন্য লিনাক্সে কাজ করে awk- ৪.০.২। নিখরচায় /proc/curpoc/cmdline, এবং awkফলাফল আপনার মত তবে সাথে কাজ করে gawk
ট্যালিজিন

ডিফল্ট উবুন্টুতে এটি কাজ করে না। একটি পোর্টেবল সমাধান খুঁজে ভাল লাগবে।
cipper

1
@ টালিইজিন: কিউনগলমের উত্তরটি কোনও সমাধান নয় কারণ এটির নাম সহ স্ক্রিপ্টটি ম্যানুয়ালি খাওয়ানো দরকার। এটি কল করার মতো awk -vNAME="myscript.awk" ./myscript.awkএবং তারপর স্ক্রিপ্টের ভিতরে NAME মুদ্রণের মতো । কোনও সমাধান নয়।
cipper

5

অ্যাজকে থেকে কম্যান্ডের নাম পাওয়ার কোনও প্রত্যক্ষ উপায় আমি জানি না। তবে আপনি এটি একটি উপ-শেলের মাধ্যমে খুঁজে পেতে পারেন।

জবুথবু ব্যক্তি

GNU awk এবং psকমান্ডের সাহায্যে আপনি প্রসেস আইডি ব্যবহার PROCINFO["PID"]করে কমান্ডের নামটি কার্যকারণ হিসাবে পুনরুদ্ধার করতে পারেন । উদাহরণ স্বরূপ:

cmdname.awk

#!/usr/bin/gawk -f

BEGIN {
  ("ps -p " PROCINFO["pid"] " -o comm=") | getline CMDNAME
  print CMDNAME
}

মক এবং নাক

আপনি একই পন্থাটি ব্যবহার করতে পারেন তবে বিশেষ শেল ভেরিয়েবল (পিতামাতার পিআইডি) awkথেকে পিআইডি পান $PPID:

cmdname.awk

#!/usr/bin/mawk -f

BEGIN { 
  ("ps -p $PPID -o comm=") | getline CMDNAME
  print CMDNAME
}

পরীক্ষামূলক

স্ক্রিপ্টটি এভাবে চালান:

./cmdname.awk

উভয় ক্ষেত্রে আউটপুট:

cmdname.awk

আমি একটি ত্রুটি পেয়েছি: / বিন / শ: 1: -ও: পাওয়া যায় নি
cipper

@ এসিপার: এটি কেবল জিএনইউ অ্যাডকের সাথে কাজ করে, আমি অনুপস্থিত শেবাং লাইন যুক্ত করেছি।
থোর

থেকে জবুথবু ব্যক্তি ম্যানুয়াল : POSIX মতে, 'অভিব্যক্তি | গেটলাইনটি অস্পষ্ট হয় যদি এক্সপ্রেশনটিতে '$' ব্যতীত অপরিকল্পিত অপারেটর থাকে - উদাহরণস্বরূপ, "" প্রতিধ্বনি "" তারিখ "| গেটলাইন 'দ্ব্যর্থহীন কারণ কনকনেটেশন অপারেটর প্রথম বন্ধনীযুক্ত নয়। আপনার এটি '("প্রতিধ্বনি" "তারিখ") হিসাবে লেখা উচিত getline 'আপনি যদি চান আপনার প্রোগ্রামটি সকল বিশ্রী বাস্তবায়নে পোর্টেবল হতে পারে।
cipper

1
এটির প্রয়োজন হলে gawkএটি gawkসমাধানের পরিবর্তে একটি awkসমাধান। আমি মনে করি @ এসিপি তার প্রশ্নের "একটি বহনযোগ্য সমাধান" যুক্ত করা উচিত।

1
@ থোর: কিউংলমের উত্তরটি কোনও সমাধান নয় কারণ এটির নাম সহ স্ক্রিপ্টটি ম্যানুয়ালি খাওয়ানো প্রয়োজন। এটি কল করার মতো awk -vNAME="myscript.awk" ./myscript.awkএবং তারপর স্ক্রিপ্টের ভিতরে NAME মুদ্রণের মতো । কোনও সমাধান নয়।
cipper

4

পসিক্স সহ awk:

#!/usr/bin/awk -f

BEGIN {
    print ENVIRON["AWKSCRIPT"]
}

তারপর:

AWKSCRIPT=test.awk ./test.awk
test.awk

5
আপনি নিজেই এতে স্ক্রিপ্টের নামটি খাওয়ান, এটি কোনও স্ব-মুদ্রণের উপায় নয়
cipper

@ এসিপার: আচ্ছা, আমি কল্পনা করতে পারি এটি সবচেয়ে সহজ এবং পোর্টেবল উপায়।
cuonglm

3
এটি কল করার মতো awk -vNAME="myscript.awk" ./myscript.awkএবং তারপরে NAMEস্ক্রিপ্টের ভিতরে ভেরিয়েবল মুদ্রণ করা । কোনও সমাধান নয়।
cipper

@ এসিপার: যদি আপনি উল্লেখ করেন তবে এটিই একমাত্র উপায় mawk। এবং ব্যবহার করাও ব্যবহারের ENVIRONমতো নয় -vNAME="myscript.awk", যেহেতু কখন mawkপালানোর ক্রমটি প্রসারিত হবে NAME
cuonglm

4

GNU awk ব্যবহার করা হচ্ছে

জিএনইউ অ্যাডকের ব্যবহারকারীর গাইডটি পরীক্ষা করা হচ্ছে - 7.5.2 বিল্ট-ইন ভেরিয়েবল যা তথ্য জানায় আমি হোঁচট খেয়েছি :

প্রকল্প #

এই অ্যারের উপাদানগুলি চলমান অভ কর্মসূচি সম্পর্কে তথ্য অ্যাক্সেস সরবরাহ করে। নিম্নলিখিত উপাদানগুলি (বর্ণানুক্রমিকভাবে তালিকাভুক্ত) উপলব্ধ থাকার গ্যারান্টিযুক্ত:

PROCINFO [ "PID"]

বর্তমান প্রক্রিয়াটির আইডি।

এর অর্থ আপনি রানটাইম চলাকালীন প্রোগ্রামের পিআইডি জানতে পারবেন। তারপরে, system()এই প্রদত্ত পিআইডি দিয়ে প্রক্রিয়াটি অনুসন্ধান করার জন্য এটি ব্যবহার করার বিষয় :

#!/usr/bin/gawk -f
BEGIN{ pid=PROCINFO["pid"]
       system("ps -ef | awk '$2==" pid " {print $NF}'")
}

আমি ব্যবহার করি ps -ef, যা দ্বিতীয় কলামে পিআইডি প্রদর্শন করে। ধরে awk -f <script>নিই এক্সেকিউগটিজটি সম্পন্ন হয়েছে এবং অন্য কোনও পরামিতি নেই, আমরা ধরে নিতে পারি লাইনের শেষ ক্ষেত্রটিতে আমরা চাইছি তথ্য রয়েছে।

যদি আমাদের কিছু প্যারামিটার থাকে তবে আমাদের লাইনটি আলাদাভাবে পার্স করতে হবে - আরও ভাল, psআমরা আগ্রহী কেবল কলামগুলি মুদ্রণের জন্য অপশনগুলির কিছুটি ব্যবহার করুন ।

পরীক্ষা

$ awk -f a.awk 
a.awk
$ cp a.awk hello.awk
$ awk -f hello.awk 
hello.awk

আরও মনে রাখবেন যে জিএনইউ অ্যাডব্লিউ ব্যবহারকারীর গাইডের আর একটি অধ্যায় আমাদের বলে যে এআরজিভি যাওয়ার উপায় নয়:

1.1.4 এক্সিকিউটেবল অ্যাড প্রোগ্রাম

অবশেষে, এআরজিভি [0] এর মান (বিল্ট-ইন ভেরিয়েবলগুলি দেখুন) আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে পরিবর্তিত হয়। কিছু সিস্টেম সেখানে 'অজক' রাখে, কেউ কেউ উইকের পুরো পথের নাম রাখে (যেমন / বিন / অ্যাওক), এবং কিছু আপনার স্ক্রিপ্টের নাম দেয় ('পরামর্শ')। (ডিসি) আপনার স্ক্রিপ্টের নাম দেওয়ার জন্য এআরজিভি [0] এর মানের উপর নির্ভর করবেন না।


দুর্ভাগ্যক্রমে PROCINFO হ'ল একটি গোক বৈশিষ্ট্য, সাধারণ বিশৃঙ্খল নয়। উদাহরণস্বরূপ এটি মাউকে পাওয়া যায় না (যা উবুন্টুতে ডিফল্টরূপে ইনস্টল করা হয়)
cipper

আমি জানি ... আপনি কেন [গোকের সাথে] প্রশ্নটি ট্যাগ করেছিলেন?
ফেডরকিই

তুমি ঠিক বলছো. আমি যখন প্রশ্ন পোস্ট করলাম তখন আমি মাক এবং গাওয়াকের মধ্যে এই সমস্ত পার্থক্য সম্পর্কে অবগত ছিলাম না। ট্যাগটি এখন মাককে পরিবর্তিত হয়েছে।
cipper

@ এসিটার ভাল:) আমি আসলে পরীক্ষার চেষ্টা করছিলাম mawkএবং এটি কাজ করতে পারিনি, যাতে আমি gawkআমার উবুন্টুতে ইনস্টল করেছি এবং এটি কাজ করে। সুতরাং একটি workaround ব্যবহার করা যেতে পারে gawk: ডি
fedorqui

1
@terdon, gawkউবুন্টুতে ডিফল্টরূপে ইনস্টল করা হয়নি (বা কমপক্ষে কিছু উবুন্টু সংস্করণ, যেখানে mawkডিফল্ট awkপ্রয়োগ রয়েছে)। আইআইআরসি, আমাকে এটি ডিবিয়ানতেও ইনস্টল করতে হয়েছিল।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.