সম্পূর্ণ পথ নির্দিষ্ট না করে ব্যাশ বিল্টিনের পরিবর্তে সিস্টেম কমান্ড ব্যবহার করুন


17

আমি বাশকে আমার ইন্টারেক্টিভ শেল হিসাবে ব্যবহার করি এবং আমি ভাবছিলাম যে বাশকে শেল বিল্টিন কমান্ডের পরিবর্তে সিস্টেমে কমান্ড চালানোর কোনও সহজ উপায় আছে যেখানে তারা উভয় একই নামটি ভাগ করে দেয়।

উদাহরণস্বরূপ, সিগন্যাল প্রেরণের পরিবর্তে নামকৃত প্রক্রিয়া (এস) এর প্রসেস আইডি (পিড) প্রিন্ট করতে সিস্টেমটি kill(থেকে util-linux) ব্যবহার করুন :

$ /bin/kill -p httpd
2617
...

সিস্টেম কমান্ডের পুরো পথ নির্দিষ্ট না করে, সিস্টেম কমান্ডের পরিবর্তে ব্যাশ বিল্টিন ব্যবহার করা হয়। killBuiltin নেই -pতাই কমান্ড ব্যর্থ বিকল্প:

$ kill -p httpd
bash: kill: p: invalid signal specification

আমি মেক বাশ-এ তালিকাবদ্ধ উত্তরগুলি শেল বিল্ট ইন-এর পরিবর্তে বহিরাগত `টাইম` কমান্ডটি ব্যবহার করার চেষ্টা করেছি তবে তাদের বেশিরভাগই কেবল কাজ করে কারণ timeআসলে শেল কীওয়ার্ড - শেল বিল্টিন নয়

অল্প সময়ের জন্য বাশ বিল্টিনকে অস্থায়ীভাবে অক্ষম করা ছাড়া enable -n kill, আমি এখন পর্যন্ত সবচেয়ে ভাল সমাধানটি ব্যবহার করেছি:

$(which kill) -p httpd

শেল বিল্টিনের পরিবর্তে কোনও বহিরাগত কমান্ড কার্যকর করার জন্য আরও সহজ (কম টাইপিংয়ের সাথে জড়িত) উপায় আছে কি?

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


which killব্যাকটিক্সে আবদ্ধ হওয়া (এগুলিকে মন্তব্যে রাখতে পারবেন না) কিছুটা ছোট।
14

ভালো খবর কমান্ড প্রতিস্থাপনের জন্য "নতুন" এর সিনট্যাক্সটি ব্যবহার করার জন্য আমি কয়েক বছর প্রশিক্ষণ দিয়েছি :) :)
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

@ অলিগ: এফওয়াইআই, আপনি ব্যাকস্ল্যাশ (\) এর আগে তাদের মন্তব্যগুলিতে মন্তব্যগুলিতে `ব্যাকটিকগুলি রাখতে পারেন। কিন্তু কারণে দিয়ে বিদ্ধ হয় $(…)- দেখুন এই , এই , এবং এই
জি-ম্যান

উত্তর:


20

ধরে envনেওয়া আপনার পথে রয়েছে:

env kill -p http

env(সম্ভবত) পরিবর্তিত পরিবেশে এটির প্রথম যুক্তির দ্বারা নির্বাহযোগ্য ফাইল চালায়; যেমন শেল বিল্ট-ইন কমান্ডগুলি নিয়ে কাজ করে না বা এটি কাজ করে না।

এটি কিছু শেল জব কন্ট্রোল ক্রাফ্ট তৈরি করে তবে বাহ্যিক কমান্ডের উপর নির্ভর করে না:

exec kill -p bash &

execবর্তমান শেলটি প্রতিস্থাপনের জন্য এক্সিকিউটেবলের প্রয়োজন, সুতরাং কোনও বিল্ট-ইন ব্যবহার করবেন না। কাজটি পটভূমিতে চালিত হয় যাতে আপনি কাঁটাযুক্ত ব্যাকগ্রাউন্ড শেলটি প্রতিস্থাপন করুন, আপনার বর্তমান শেলটি নয়।


2
envস্পষ্টভাবে সঠিক উত্তর আইএমএইচও।
abligh

@ অলিগ: আপনি আমার মুছে দেওয়া উত্তরে মন্তব্যে ঠিক বলেছেন। command -p cmdবাহ্যিক কমান্ড কল zsh, না bash
cuonglm

6
(exec kill -p http)কাজটি আপনার বর্তমান শেলের পরিবর্তে একটি উপ-শেল প্রতিস্থাপন করবে এবং আপনাকে জব কন্ট্রোল ক্রাফ্টের সাথে ডিল করতে হবে না।
মাইকেল হফম্যান

1
env@ অ্যান্থনি জিওগেইগান আসলে, তবে শেল বিল্টিনগুলি সম্পর্কেও জানে না, কারণ এটি শেল নয়। একইভাবে এফেক্ট পেতে চাই niceবা xargsবা ওই জাতীয় অন্য কোন প্রোগ্রাম।
ব্যবহারকারী 253751

1

আপনি যা চান তা করার সহজ উপায় হ'ল লাইন লাগানো

alias kill="/bin/kill"

আপনার মধ্যে ~/.bashrc ফাইলেরএর পরে, প্রতিটি নতুন লগইন / বাশের অনুরোধ "কিল" হিসাবে ব্যাখ্যা করবে /bin/kill


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

1

যদি আপনি এমন কোনও সমাধান জানেন যার জন্য কিছু টাইপিংয়ের প্রয়োজন হয় এবং আপনি এমন একটি সমাধান চান যা কম টাইপিংয়ের পক্ষে বিবেচনা করে তবে এটি তৈরি করুন:

runFile() { local cmd="$1"; shift; cmd="$(which "$cmd")" && "$cmd" "$@"; }

সাধারনত কিছুটা প্রচেষ্টা নেয় এমন স্ট্রোক সংমিশ্রণ হ'ল কম্পিউটারগুলি যা এক্সেল করে।


1
এটি একটি ভাল সাধারণ বিষয় তাই আমি আপনার উত্তর upvote। বিগত কয়েক বছর ধরে, আমি নিয়মিত যে সিস্টেমগুলি ব্যবহার করি তার জন্য আমি উপকরণ, ফাংশন এবং স্ক্রিপ্টগুলির সংগ্রহ তৈরি করেছি। যাইহোক, আমি অ-কাস্টমাইজড সমাধানগুলি ব্যবহার করতে পছন্দ করি যেখানে সম্ভব হয় আমাকে মাঝে মধ্যে তাজা ইনস্টল বা সার্ভারগুলিতে কাজ করতে হয় যা আমি সেটআপ না করি। ধন্যবাদ।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

1

এই খুব নির্দিষ্ট ক্ষেত্রে, কমান্ডটি প্রয়োজনের pgrepজন্য একটি সঠিক মিল।

সাধারণ অর্থে, একটি ফাংশন কাজ করে। "ফাইল কমান্ড" থেকে:

fcmd(){ local a=$1; shift; $(which "$a") "$@"; }

হিসাবে কল

fcmd kill -p httpd

তবে আপনার যদি কম টাইপিংয়ের দরকার হয় তবে একটি ভাল ওরফে ছাড়া আর কোনও ছোট উপায় নেই।

"তালিকা পিড" (এলপি) ধারণাটি থেকে:

alias lp='/bin/kill -p'

তারপরে, কেবল টাইপ করুন:

lp httpd

0

(Zsh এ) আপনি বিল্টিনের পরিবর্তে সিস্টেম সংস্করণটি পেতে কোনও কমান্ডের নামকে = চিহ্ন দিয়ে উপসর্গ করতে পারেন। কোনও নির্দিষ্ট দৃশ্যের জগাখিচুড়ি করে এমন কোনও এলিয়াসকে ডজ করারও এটি একটি সহজ উপায়।

$ =kill -p httpd

1
আমি এটি চেষ্টা করেছি বাশ সংস্করণ ৪.৩.৩০ সহ এবং এটি কার্যকর হয়নি। এর আগে এর সিনট্যাক্স আমি আগে কখনও দেখিনি; আপনি যেখানে এই বৈশিষ্ট্যটি নথিভুক্ত করা হয়েছে সেখানে একটি লিঙ্ক যুক্ত করতে পারেন? আমি কমান্ডের অ-অ্যালিয়াসিত সংস্করণটি চালানোর জন্য সাধারণত একটি ব্যাকস্ল্যাশ সহ একটি উপনাম উপসর্গ করতাম।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

@ অ্যান্টনি সম্ভবত এটিই zshএকমাত্র জিনিস। আমি এটি নিয়মিত ব্যবহার করি তবে আমি bashআগামীকাল একটি কম্পিউটার থেকে পরীক্ষা করব ।
কালেব

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

-1

আপনি নিজের killমানচিত্রের বিরুদ্ধে একটি বাগ্রেপোর্ট পাঠাতে এবং জিজ্ঞাসা করতে পারেন যে এটিতে কেন এমন স্ট্যান্ডার্ড বিকল্প নেই যা আপনি যখনই এই বৈশিষ্ট্যগুলি পেতে চান তখন pkillব্যবহার pkillকরেনpkill.

যদি আপনি কল করেন:

pkill httpd

আপনি যে সমস্যাগুলি বর্ণনা করেছেন তা এড়াতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.