কোন কমান্ডটি আসলে শেলটিতে একটি উপাধি বা ফাংশনের মাধ্যমে কীভাবে চালিত হয়েছিল তা আমি কীভাবে দেখতে পারি


20

উদাহরণস্বরূপ আমার একটি বাশ ফাংশন (বা উরফ) রয়েছে function install() {sudo apt-get install $@}। কমান্ডটি চালানোর সময় install dicelab, আমি যা প্রত্যাশা করি তা আসলে চালানো হবে sudo apt-get install dicelab। শেলটি আসলে কী চালাচ্ছিল তা আমি কোথায় দেখতে পাব? আমি নিশ্চিত করতে চাই যে আমার আরও জটিল উপাত্তগুলি প্রত্যাশা অনুযায়ী কাজ করছে।


এটা কি $@আপনার ওরফে অংশ? মনে রাখবেন যে উপাধিগুলি সত্যই যুক্তি সমর্থন করে না, এটি প্রাসাদের অবস্থানগত পরামিতিগুলিতে প্রসারিত হবে (যদি থাকে তবে) যে নামটি ডাকবে। দৌড়ানোর স্বাভাবিক somealias some argsউপায়টি কেবলমাত্র ওরফে প্রসারিত করে এবং এটি অনুসরণ করার জন্য যুক্তিগুলি রেখে কাজ করে। আপনি যদি সত্যিই আর্গুমেন্টগুলি অ্যাক্সেস করতে সক্ষম হতে চান তবে একটি ফাংশন ব্যবহার করুন এবং উদ্ধৃত করুন"$@"
ইলক্কাচু


1
অ্যালোনআভিভ, ভাল :) তবুও, ভালভাবে উদ্ধৃত করার অভ্যাসটি অর্জন করুন "$@", সাদা স্থান বা গ্লোব অক্ষরের সাথে যুক্তি অন্যথায় জ্বলতে থাকবে।
ইল্কাচ্চু

1
এই টুইটটি সদৃশ নয় অন্য প্রশ্নটি শেল ফাংশনগুলির সাথে সম্পর্কিত নয়।
কুসালানন্দ

2
এটির বিষয় সম্পূর্ণরূপে পরিবর্তনের জন্য সম্পাদিত না হওয়া পর্যন্ত এটিই ছিল না (এবং বিদ্যমান উত্তরগুলির মধ্যে একটিকে অকার্যকর)।
মাইকেল হোমার 10

উত্তর:


29

set -xশেল ব্যবহার করুন ।

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

ব্যবহার set -xসক্রিয় xtraceশেল বিকল্প ( set +xএটা বন্ধ হয়ে) এবং কাজ করা উচিত সব বোর্ন মত শাঁস, মত bash, dash ksh93, pdkshএবং zsh। এটি শেলটি কমান্ডটি প্রদর্শন করতে অনুরোধ করে যা উফের প্রসার এবং পরিবর্তনশীল প্রসারণ ইত্যাদির পরে সম্পাদিত হয়।

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

কয়েকটি ফাংশন সহ উদাহরণ:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

আমি set -xডিফল্টরূপে আমার সমস্ত ইন্টারেক্টিভ শেল নিয়ে চলছে । আসলে কী কার্যকর হয়েছিল তা দেখে ভাল লাগল ... তবে আমি লক্ষ্য করেছি যে প্রোগ্রামেবল ট্যাব সমাপ্তি ইত্যাদি কিছু শেলের মধ্যে অযাচিত ট্রেস আউটপুট তৈরি করতে পারে।


14

আপনি ব্যবহার করতে পারে shell-expand-lineযা আবদ্ধ হয়, Control- Alt- eডিফল্টরূপে:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

অন্যান্য জিনিসের মধ্যে এটি বর্তমান লাইনে উপস্বকে তাদের সংজ্ঞা দিয়ে প্রতিস্থাপন করবে যাতে আপনি যে কমান্ডটি এখনও রয়েছেন তা দেখতে পান যাচ্ছে চালানো। উদাহরণ:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

এটি একটি দুর্দান্ত বৈশিষ্ট্য। আপনি কি জানেন যে zsh এর সমমানের আদেশ আছে কিনা shell-expand-line?
the_velour_fog

দুঃখিত, আমি ব্যবহার করি না বলেই করি না zsh। তবে কিছু লোক তাদের নিজস্ব ধারণা নিয়ে এসেছেন: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
আরকাদিউজ দ্রবসিজেক


1

আপনি যে typeউপনাম বা কোনও ফাংশন সংজ্ঞা চালাতে চলেছেন তা দেখতে আপনি ব্যাশ বিল্টিন ব্যবহার করতে পারেন :

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.