./Test পরিবর্তে .টেস্ট হিসাবে কার্যকর করুন


26

ধরুন আমি এক্সিকিউটেবল ফাইলের মতো একই ফোল্ডারে আছি, এটি সম্পাদন করার জন্য আমার এটি টাইপ করতে হবে:

./file

আমি বরং টাইপ করতে চাই না /, কারণ /টাইপ করা আমার পক্ষে কঠিন।

একটি ফাইল চালানোর জন্য সহজ উপায় আছে? আদর্শভাবে কিছু সাধারণ বাক্য গঠন যেমন:

.file

বা /অক্ষরটি sertোকানোর চেয়ে আরও সহজ কিছু but

সম্ভবত /binডিরেক্টরিতে কিছু যুক্ত করার , বা দোভাষীর জন্য একটি উপাধি তৈরি করার উপায় রয়েছে যাতে আমি ব্যবহার করতে পারি:

p file

9
এক্সমেডম্যাপ ব্যবহার করে অন্য কী দিয়ে হয়ত অদলবদল /? সুতরাং কমপক্ষে এটি টাইপ করা সহজ
গাই

26
পার্শ্ব নোট হিসাবে, ইউনিক্সে ব্যাপকভাবে/ ব্যবহৃত হয় , মূলত ডিরেক্টরি বিভাজক হিসাবে। এটি টাইপ করার কোনও সহজ উপায় খুঁজে পেতে আপনি সম্ভবত আরও ভাল।
ক্রাইলিস

7
এই মুহূর্তে @RossPresser এই প্রশ্নটি খুব সামান্য বোঝায়। এবং ./ ফাইলের শুরুতে দুটি সম্পূর্ণ ভিন্ন অর্থ প্রযুক্তিগত কারণে যে কোনও শিক্ষানবিশকে জানা উচিত for /বেশিরভাগ লোকের জন্য টাইপ করা কঠিন নয়, এবং যদি ওপিতে কোনও আঘাত থাকে যা এটি প্রতিরোধ করে, তাদের বিকল্প কীবোর্ড বিন্যাসগুলি বিবেচনা করা উচিত, যেহেতু /টার্মিনালে থাকাকালীন তারা পুরোপুরি এড়াতে পারে এমন কোনও উপায় নেই ।
জেএফএ

1
@ জেএফএ মহাদেশীয় ইউরোপ এবং দক্ষিণ আমেরিকাতে ব্যবহৃত বেশিরভাগ কীবোর্ড লেআউট /শিফট-- স্থাপন করেছে যা কোনও আঘাত ব্যতীত টাইপ করা তুলনামূলকভাবে কঠিন is
nitro2k01

6
ইতিহাস সম্পাদনা করুন: " কেন 22 ঘন্টা পোর্টে
এসএসএসের

উত্তর:


35

এটি "ঝুঁকিপূর্ণ" হতে পারে তবে আপনি কেবল এটি করতে পারেন। আপনার পথের মধ্যে

অন্যদের মধ্যে যেমন বলা হয়েছে, এটি সর্বদা নিশ্চিত করা বিপজ্জনক হতে পারে। শুরু থেকে বরং পথের শেষে।


1
সত্যিই দেখুন না যে এটি কীভাবে "ঝুঁকিপূর্ণ": লিনাক্সের অনেক আগে থেকেই আমার পথটি সেভাবেই ছিল এবং এটি কখনও সামান্যতম সমস্যার কারণ হয়নি।
জামেস্কফ

21
@ জেমসেকফ এটি ঝুঁকিপূর্ণ কারণ আপনি যদি cdএমন কোনও ডিরেক্টরিতে যান যা বিশ্ব লিখনযোগ্য এবং আপনার পথে নেই এমন একটি কমান্ড ব্যবহার করার চেষ্টা করেন তবে আপনি সেই পথে কোনও নামে লিখেছেন এমন কোনও নাম দ্বারা কার্যকর (সম্ভবত দূষিত) কার্যকর করতে পারেন। .আপনার পথের শুরুতে রাখলে এটি আরও খারাপ । lsসেক্ষেত্রে, যদি আপনি lsসেই ডিরেক্টরিতে কল করার চেষ্টা করেন তবে একটি দূষিত এক্সিকিউটেবলকে মৃত্যুদন্ড কার্যকর করা হবে ।
6:58

2
উপরে নির্দিষ্ট কারণে দয়া করে এটি এড়ান। pকমান্ড ভাল হবে।
Guido

11
@ জেমসেকফ যখন এটি "আপনার" সিস্টেম হয় এবং আপনি কেবল এটি ব্যবহার করেন, এটি এতটা খারাপ নয়। একাধিক ব্যবহারকারী সিস্টেমে সমস্যাটি এসেছে (এবং বহু বছর ধরে অনেকগুলি ইউনিক্স অ্যাডমিনকে ছড়িয়ে দিয়েছে)। একটি সঙ্গে .প্রথম দিকে PATH, কি সব একটি দূষিত ব্যবহারকারী চাহিদা একটি জাল ড্রপ ls"অদ্ভুত কিছু তাকান" তাদের ডিরেক্টরির মধ্যে কমান্ড অ্যাডমিন প্ররোচিত এবং তারা রুট এক্সেস পেয়েছেন।
ট্রিপহাউন্ড

1
ভাল সমাধান, যদিও testপ্রশ্নের শিরোনামে ( testযেমন একটি শেল বিল্ট-ইন, এবং সম্ভবত $PATHইতিমধ্যে আপনার কোথাও কোথাও উপস্থিত রয়েছে ) ফাইলটির নামকরণ হওয়ার পরে এটি কাজ করবে না ।
হলুদন্তফিল

71

../কমপক্ষে আধুনিক বাশ শেলগুলিতে স্বয়ংক্রিয়ভাবে সম্পূর্ণ (টাইপ .এবং টিপুন Tab) পূর্ণ হবে, সুতরাং আপনার কোনও জটিল বা নিরাপত্তাহীন (যেমন PATHপরিবর্তনের মতো ) সমাধান ব্যবহার করা উচিত নয় ।

যদি এটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ না হয় তবে আপনার "বাশ-সমাপ্তি" প্যাকেজটি ইনস্টল করতে হবে।


তুমি কি নিশ্চিত? .একাধিক সমাপ্ত প্রার্থী রয়েছে: .(বর্তমান দির), ..(প্যারেন্ট দির), .কমান্ড (যা বাশ একটি নন-স্ট্যান্ডার্ড ওরফে সরবরাহ sourceকরে), এবং যে কোনও ডটফিলস উপস্থিত রয়েছে। হতে পারে bash-completionপ্যাকেজ এটিকে উপেক্ষা করে; আমি এটিকে নিষ্ঠুরভাবে বিরক্তিকর বলে মনে করি (উদাঃ কোনও makeকমান্ড লাইনে দিরের নামগুলি ট্যাব-সম্পূর্ণ করা অসম্ভব করে তোলে এবং সাধারণত অন্তর্নিহিত নিয়মগুলিতে মেকফিলগুলি দিয়ে ভয়ঙ্কর হয়) তাই আমি সর্বদা এটি পরিষ্কার করি।
আর ..

3
আমি এটি চেষ্টা করেছিলাম, এবং হ্যাঁ, এটি এভাবে স্বয়ংক্রিয়ভাবে পূর্ণ হয়। নিয়মিত ব্যবহারকারীর কাছে প্রায় প্রতিটি ক্ষেত্রেই এটি চান: আমি মনে করি না যে আমি কখনও ডটফিল দেখেছি যা কার্যকর করা উচিত, একটি উপ-ডিরেক্টরিতে কিছু চালানো পিতামাতার ডিরেক্টরিতে কিছু চালানোর চেয়ে অনেক বেশি সাধারণ এবং আইএমও এটি করে makeলক্ষ্য সন্ধানের একটি জঘন্য কাজ ।
l0b0

ব্যাশ ৩.২ দিয়ে এটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ হয় না। এটি কি বাশ 4 এ নতুন হতে পারে?
ক্যালিমো

2
@ ক্যালিমো সম্ভবত ব্যাশ-সমাপ্তির সাম্প্রতিক সংস্করণগুলিতে আরও নতুন। এটি একটি মৌলিক পরিবর্তন থেকে অনেক দূরে।
l0b0

42

বা .. সম্ভবত বাশার্ক ফাইলটিতে দোভাষীকে একটি উপনাম দেওয়া এবং তারপরে সহজভাবে

   p  file

এই জাতীয় ফাংশন লেখা সম্ভব:

p() {
 ./"$@"
}

আপনার ~/.bashrc। তারপরে আপনি p app argumentsতার পরিবর্তে চালাতে সক্ষম হবেন ./app arguments। এই সমাধানটি স্ক্রিপ্ট এবং বাইনারি সহ যে কোনও ধরণের এক্সিকিউটেবলের জন্য কাজ করে।

"$@"ফাংশনটিতে যথাযথ উদ্ধৃত যুক্তিগুলির তালিকায় প্রসারিত হয় (গ্লোব বা পরিবর্তনশীল সম্প্রসারণ থেকে সমস্ত বিশেষ অক্ষর সংরক্ষণ করে), এবং @ স্কট উল্লেখ করেছে যে, বাকীটি সংরক্ষণ করে তাদের মধ্যে প্রথমটির জন্য প্রপেন্ড bashকরার পক্ষে যথেষ্ট চালাক ./


যদিও এটি অন্য কমান্ডের অধীনে অ্যাপ্লিকেশন চালানোর জন্য কম সাধারণ, যেমন strace -f p appকরা কম্পিউটার কলগুলি $(which time) p appদেখতে বা এটি কতক্ষণ সময় নেয় তা দেখতে পছন্দ করে। pএক্সিকিউটেবল স্ক্রিপ্ট হিসাবে যে দুটি নির্দিষ্ট উদাহরণ আমি স্বীকৃত তা আরও ভাল কাজ করবে। কোনও সমাধানই কাজ করতে পারে না ldd p app, তবে একটি সম্পূর্ণ পথের প্রয়োজনের ldd ক্ষেত্রেও পৃথক, সম্ভবত এই কারণগুলির জন্য।
সোর্সজেডি

হ্যাঁ, প্রতিস্থাপন p app argsসঙ্গে ./app argsএকটি উপায় যার কারো কাছে অদৃশ্য প্রাক প্রসেসর কিছু মাধ্যমে শেল ইনপুট বংশীধ্বনিতুল্য প্রয়োজন হবে এবং কখন প্রতিকল্পন একটি অনিচ্ছাকৃত জায়গায় :) ঘটে মজা সমস্ত প্রকারের কারণ হবে মধ্যে
aitap

1
এই ক্ষেত্রে, চারপাশে কোনও উক্তি থাকা উচিত নয় $@? অন্যথায় এটি প্রোগ্রামে একটি বড় যুক্তি পাস করবে।
Kroltan

7
@ ক্রল্টন নং $@একটি অ্যারে। এর মধ্যে প্রসারিত হলে "প্রতিটি প্যারামিটার পৃথক শব্দের দিকে প্রসারিত হয়। $*আপনি যেভাবে ভাবছেন সেভাবে আচরণ করে।
বিট্রি

3
আমি বিশ্বাস করি যে আপনি এটিকে অযথা জটিল করে তুলেছেন এবং এটি p() { ./"$@"; }আপনার প্রয়োজন।
স্কট

11

আপনি করা হতে পারে .আপনার টু $PATHযেমন যোগ করে PATH=$PATH:.আপনার টু /etc/profile, এই ভাবে আপনি নির্বাহ করতে পারেনfile শুধু লেখা দ্বারা file, যদি না তা আপনার পাথ (যেমন অন্য কিছু ফোল্ডারে /usr/bin/)। নোট করুন যে এটি সাধারণত ভাল ধারণা নয়।

এটি কেন খারাপ: বলুন আপনি এমন পরিস্থিতিতে আছেন যেখানে আপনি কোনও ডিরেক্টরিের সামগ্রীতে পুরোপুরি বিশ্বাস করেন না - আপনি এটি কোথাও কোথাও কোথাও ডাউনলোড করেছেন এবং এটি চালানোর আগে আপনি এটি তদন্ত করতে চান, বা আপনি সিসাদমিনকে কিছু সাহায্য করছেন ব্যবহারকারীগণ তাদের বাড়ির ডিরেক্টরি ইত্যাদি সন্ধান করে আপনি ডিরেক্টরিটি তালিকাভুক্ত করতে চান, তাই আপনি ls টাইপ করার চেষ্টা করেন তবে উফ, আপনি একটি টাইপো বানান, এবং পরিবর্তে স্লাইড টাইপিং শেষ করেন। এই দূষিত ডিরেক্টরিটির লেখক এটি অনুমান করেছিলেন এবং এটিতে "স্ল" নামে একটি শেল স্ক্রিপ্ট রেখেছিলেন যা 'rm -rf --no-preserv-root /' চালায় (বা আরও কিছু দূষিত কিছু যেমন রুটকিট ইনস্টল করার মতো)।

(ব্যাখ্যার জন্য @ মুজারকে ধন্যবাদ)


13
যদিও আমি আন্তরিকভাবে একমত, এটি সম্ভবত এটি ব্যাখ্যা করবে কেন এটি একটি ভাল ধারণা নয়।
ymbirtt

16
এটি কেন খারাপ: বলুন আপনি এমন পরিস্থিতিতে আছেন যেখানে আপনি কোনও ডিরেক্টরিের সামগ্রীতে পুরোপুরি বিশ্বাস করেন না - আপনি এটি কোথাও কোথাও কোথাও ডাউনলোড করেছেন এবং এটি চালানোর আগে আপনি এটি তদন্ত করতে চান, বা আপনি সিসাদমিনকে কিছু সাহায্য করছেন ব্যবহারকারীগণ তাদের বাড়ির ডিরেক্টরি ইত্যাদি সন্ধান করে আপনি ডিরেক্টরিটি তালিকাভুক্ত করতে চান, তাই আপনি ls টাইপ করার চেষ্টা করেন তবে উফ, আপনি একটি টাইপো বানান, এবং পরিবর্তে স্লাইড টাইপিং শেষ করেন। এই দূষিত ডিরেক্টরিটির লেখক এটি অনুমান করেছিলেন এবং এটিতে "স্ল" নামে একটি শেল স্ক্রিপ্ট রেখেছিলেন যা 'rm -rf --no-preserv-root /' চালায় (বা আরও কিছু দূষিত কিছু যেমন রুটকিট ইনস্টল করার মতো)।
মুজার

2
মূল্যবান ব্যাখ্যা করে যে বর্তমান ডিরেক্টরিটি $ PATH এর শুরুতে থাকলে, পরিবর্তে, আক্রমণকারী কেবলমাত্র ls বা অন্যান্য সাধারণ কমান্ডগুলিকে ওভাররাইড করতে পারে
ডালিসন জুনিও

@ মুজার হুগিউজ টিনফয়েলের টুপি এখানে।
সোমব্রেরো চিকেন

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

10

উদাহরণস্বরূপ আপনি দোভাষীকে কল করতে পারেন

bash test

এক্ষেত্রে স্ক্রিপ্টটি চলবে এমনকি যদি এটিতে একটি শেবাং লাইন না থাকে (যেমন #!/bin/bash) বা এক্সিকিউটেবল বিট না থাকে। এটি চালানোর জন্য আপনাকে সঠিক দোভাষীটি জানতে হবে। আপনি সঠিক দোভাষীকে কল করেছেন কিনা তা নিশ্চিত করার জন্য আপনি প্রথমে ফাইলের শেবাং লাইনটি পড়তে পারেন, উদাহরণস্বরূপ যদি শেবাং লাইনটি বলে

#!/usr/bin/env python3

তুমি ফোন করবে

python3 test

7
দোভাষী কেবল কোডটি ব্যাখ্যা করেন, তারা বাইনারি ফাইলগুলি চালাবেন না
ম্যাক কার্নেল

এই উত্তরটি কিছুটা যৌক্তিক কারণ সম্ভবত ব্যাশার্ক ফাইলটিতে দোভাষীকে একটি নাম দেওয়া যেতে পারে।

5
@ এমসি কার্নেল ভাল পয়েন্ট, এটি কেবল তখনই কাজ করে যদি কোনও অনুবাদক থাকে, সংকলিত এক্সিকিউটেবলের জন্য নয়
জান্না

2
সংকলিত এক্সিকিউটেবলের জন্য একজন দোভাষী আছেন:/lib/ld.so
দিমিত্রি কুদরিয়াভসেভ

7

আমি যতদূর জানি, এটি অর্জনের কোনও উপায় নেই যদি না আপনি এনভির পথে কোনও ফাইল অন্তর্ভুক্ত না করেন, সুতরাং আপনি কেবল এটি টাইপ করে চালাতে পারেন: file

.fileএটি ভিন্ন ফাইলের নাম হওয়ায় কাজ করবে না। এটি একটি ফাইল বলা হয় .fileএবং না ./file

আমি অনুভব করেছি যে আপনার জন্য স্ল্যাশ টাইপ করা কঠিন হতে পারে কারণ অ-ইংরাজী বিন্যাস, সম্ভবত? সেক্ষেত্রে এটি আমার ক্ষেত্রেও ঘটে, তাই আমি প্রায়শই আমার কীবোর্ড লেআউটটি ইংরেজিতে অলপ + শিফ্ট উইন্ডোতে চাপিয়ে (আমি ssh থেকে লিনাক্স ব্যবহার করি)


7

লোকেরা যুক্ত .করার পরামর্শ দিয়েছে PATH, যা বিপজ্জনক কারণ এটি একটি ঝুঁকি তৈরি করে যে আপনি দুর্ঘটনাক্রমে একটি বিশ্ব লিখনযোগ্য ডিরেক্টরিতে লাগানো একটি দূষিত প্রোগ্রাম পরিচালনা করবেন। কিন্তু, যদি আপনি কয়েক ডিরেক্টরিগুলি থেকে এক্সিকিউটেবল প্রোগ্রাম যা আপনার নিজস্ব আছে এবং শুধুমাত্র আপনার দ্বারা লিখনযোগ্য হয়, তাহলে এটি নিরাপদ (মোটামুটি নিরাপদ?) এর লাগাতে ঐ পরিচালক (ies এর) মধ্যে PATH, মত একটি লাইন যোগ করে

PATH=$PATH:~/dev/myprog1:~/dev/myprog2

আপনার ~/.bashrcফাইল অবশ্যই এর অর্থ এই যে আপনি যে কোনও ডিরেক্টরি থেকে ফাইল সিস্টেমের যে কোনও ডিরেক্টরি থেকে চালাতে পারেন। উদাহরণস্বরূপ, আপনি cd /etcটাইপ করতে পারেন fooএবং এটি চলতে পারে ~/dev/myprog1/foo। এটিতে একটি ছোট্ট অসুবিধা রয়েছে যে আপনি একাধিক ডিরেক্টরিতে একই নামে প্রোগ্রাম থাকতে পারবেন না। বিশেষত, আপনার যদি foo উভয়ই প্রোগ্রামগুলি কল করা থাকে ~/dev/myprog1এবং ~/dev/myprog2, আপনি কোনও পাথ নির্দিষ্ট না করেই দ্বিতীয়টি চালাতে পারবেন না। একইভাবে আপনার যদি একটি থাকে ~/dev/myprog1/cat- তবে আপনি কেন চান?


আরেকটি পদ্ধতির, যদি আপনি কেবল কয়েকটি প্রোগ্রাম ব্যবহার করেন যা আপনি এটি করে থাকেন তা হ'ল তাদের জন্য এলিয়াসগুলি সংজ্ঞায়িত করা:

alias gizmo='./gizmo'
alias gonzo='./gonzo'

অথবা আপনি এলিয়াসগুলিতে কল করতে পারেন .gizmoএবং .gonzo যদি আপনি এটি আরও স্বজ্ঞাত হন।

প্রকৃতপক্ষে, এটি কিছুটা হলেও .আপনার সুরক্ষার মতোই সুরক্ষা ঝুঁকিপূর্ণ PATH। যদি কোনও দূষিত ব্যবহারকারী আপনার পড়তে .bashrcএবং আপনার ডাকনামগুলি দেখতে পারে, তবে তিনি কল করা ম্যালওয়্যার gizmoএবং gonzoএলোমেলো ডিরেক্টরিতে আশা করে যে আপনি এটি চালাবেন put এগুলি ব্যবহারের জন্য নিখুঁত পথের নামগুলি তৈরি করা আরও ভাল:

alias gizmo='~/dev/myprog1/gizmo'
alias gonzo='~/dev/myprog2/gonzo'

যাইহোক, আপনি একটি নির্বাহযোগ্য নামকরণ এড়ানো উচিত test, কারণ এটি একটি শেল বিল্টিন কমান্ড, এবং আপনি কেবল সেই নামে কোনও প্রোগ্রাম বা অন্য কোনও কৌশল নির্দিষ্ট করে চালাতে পারেন।


অন্যথায় আপনি একটি রেসিপি করতে পারেন (হয় যে আপনি যদি ফাইল তৈরী ব্যবহার করুন) কি make gizmoবা make gonzo
ইহাতো

আমি দুঃখিত, তবে আমি নিশ্চিত না যে এটি কীভাবে প্রশ্ন বা আমার উত্তরের সাথে সম্পর্কিত understand আপনি কি পরামর্শ দিচ্ছেন যে ওপি Makefileপ্রতিটি ডিরেক্টরিতে একটি তৈরি করে , যেমন চালিয়েmake gizmo শেষ করা যায় ? (1) এটি মনে হয় ফাংশন হিসাবে একই জিনিসটি করার একটি উদ্ভট উপায় , প্রশ্নটিতে প্রস্তাবিত, প্রাথমিকভাবে আইট্যাপ দ্বারা প্রয়োগ করা হয়েছিল এবং স্কট দ্বারা পরিমার্জন করা হয়েছিল। (২) আপনি কি সেভাবে তর্ক করতে পারেন? আইএসটিএম এর সমতুল্য । gizmopmake gizmo arg1 arg2make gizmo; make arg1; make arg2
জি-ম্যান

1
(1) সম্ভবত আমার ধৃষ্টতা ভুল কিন্তু এটা আমার কাছে op ব্যাবহার করে থেকে পরিহার চায় স্পষ্ট নয় ./মধ্যে যে ডিরেক্টরির । আমার মনে, তিনি কিছু বিকাশ করছেন এবং ./fileপ্রায়শই উত্পাদিত প্রোগ্রামটি চালানো দরকার needs আমি সত্যিই অন্য কোন দৃশ্যকল্প যেখানে এক ঘন ঘন একটি স্থানীয় ফাইলটি রান করতে হবে মনে করতে পারেন না এবং যদি তিনি তা চলছে না ঘন ঘন তিনি প্রশ্ন জিজ্ঞাসা মাথা ঘামান না চাই (তিনি বললেন কঠিন না অসম্ভব ) (2) সত্যিই না কিন্তু আপনি রেসিপি মধ্যে আর্গুমেন্ট পাস করতে পারেন।
ইহাতো

(1) ভাল, আমি অনুমান করি যে আমরা ওপির অনুপ্রেরণা এবং তার প্রশ্নের ক্ষেত্রটি অস্পষ্ট যে তাতে একমত হতে পারি। (২) লিঙ্কটির জন্য ধন্যবাদ।
জি-ম্যান 21

3

দোভাষী সম্পর্কে জান্নার জবাবটি প্রসারিত করার জন্য (দুঃখিত, কোনও মন্তব্যের জন্য কোনও উত্তর নেই): নেটিভ এক্সিকিউটেবলের জন্য একটি "দোভাষী" (ওরফে বাইনারি ইএলএফ ফাইল) হ'ল ডায়নামিক লোডার ( ld.so) তবে এটি সাধারণত আপনি চান বাক্য গঠনটি বুঝতে পারেন না:

$ /usr/lib/ld-linux-x86-64.so.2 program
program: error while loading shared libraries: program: cannot open shared object file
$ /usr/lib/ld-linux-x86-64.so.2 ./program
<program is launched>

(এছাড়াও, আপনি যদি ld.soনিজের পথে সিমিলিং না করেন তবে আপনাকে আরও লিখতে হবে /)


এটি লিনাক্স-নির্দিষ্ট, তাই না? আপনি দয়া করে এটি আরও ব্যাখ্যা করতে পারেন, কেন এটি কাজ করে? আমি ভেবেছিলাম (লিনাক্স) কার্নেল পার্সিং করবে এবং সিদ্ধান্ত নেবে যে বাইনারি কীভাবে চালানো যায়, binfmt_miscতার জন্য এটি what
পিএইচকে

2
@ phk ফাইলটি লিনাক্স-নির্দিষ্ট, তবে গতিশীল লিঙ্কার / লোডার ধারণাটি নয়। উদাহরণস্বরূপ, ফ্রিবিএসডি এর নিজস্ব নিজস্ব রয়েছে /libexec/ld-elf.so.1। লিনাক্সে, "বাইনারি কীভাবে চালানো যায়" সিদ্ধান্ত নেওয়ার মতো সহজ নয়: binfmt_miscম্যাজিক নম্বর দ্বারা ফাইলের ফর্ম্যাট সনাক্ত করে (ইএলএফ, শেবাং স্ক্রিপ্ট, সিআইএল)। এর পরে, binfmt_elfহ্যান্ডলার বলা হয়। এটি ইএলএফ শিরোনাম এবং বিভাগগুলি পার্স করে; .interpবিভাগে গতিশীল লোডারের পথ রয়েছে; এই লোডারটি কার্নেল দ্বারা শুরু করা হয়েছে, পুনঃস্থাপন করে এবং লাফিয়ে _start। ফ্রিবিএসডি-তে (অন্যদের সম্পর্কে নিশ্চিত নয়) কোনও বিনফ্মেট নেই, তবে নীতিটি +/- অনুরূপ।
ব্যাকড্রপড

1
@phk কেন এই কাজগুলো হিসাবে - ld.soনেই .interpএবং স্ট্যাটিক্যালি লিঙ্ক করা হয়েছে, যার মানে এটা তার বাহ্যিক চিহ্ন মোকাবিলা করতে হবে এবং স্থানান্তরের গণিত আরেকটি গতিশীল linker / লোডার জন্য প্রয়োজন হবে না।
22 এ ব্যাকড্রপড

আইআরটিএস সোলারিসেরও এর সমতুল্য কিছু রয়েছে।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

3

যদি আমাদের জিনিসগুলি কনফিগার করা শুরু করার অনুমতি দেওয়া হয়

mkdir -p ~/.local/bin
cat > ~/.local/bin/x << 'EOF'
#!/bin/sh
N="$1"
shift
exec "./$N" "$@"
EOF
chmod a+x ~/.local/bin/x

বেশিরভাগ আধুনিক ডিস্ট্রোজে ইতিমধ্যে AT PATH এ। / .Local / বিন অন্তর্ভুক্ত রয়েছে ( export PATH="$HOME/.local/bin:$PATH"আপনার না ~/.profileহলে আপনার সাথে যুক্ত করুন)। তারপরে আপনি x fileচালানোর জন্য ব্যবহার করতে পারেন ./file

.কমান্ড সংজ্ঞায়িত করার চেষ্টা করবেন না । কমান্ডটি . scriptইতিমধ্যে scriptবর্তমান শেলটিতে চলছে । এটি scriptবর্তমান শেলের জন্য পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করতে দেয় ।


3
আমি মনে করি এখানে একটি ভাল পরামর্শ থাকতে পারে, তবে এর মধ্যে কোনটি কী করে তার কোনও ব্যাখ্যা নেই। আমি এটি কাজ করতে পারে, কিন্তু একটি অনভিজ্ঞ ব্যবহারকারীর কোনও সুযোগ থাকবে না।
আইএমএসওপি

$ 1 শিফট করার দরকার নেই। শুধু exec "$@"
রিনিয়ারপোস্ট

$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
সোর্সজেদি

(1) কোন প্রয়োজন নেই shift $1; শুধু exec ./"$@"। (২) যেহেতু আপনি একটি শেল স্ক্রিপ্টের কথা বলছেন, তাই লোকেদের একটি .আদেশ নির্ধারণ না করার পরামর্শ দেওয়া অর্থহীন / বিভ্রান্তিকর , যেহেতু একটি ফাইল তৈরি করা অসম্ভব .। (যার নাম দেওয়া একটি উপন্যাস বা শেল ফাংশন সংজ্ঞায়িত করা সম্ভব এবং খুব অনস্বীকার্য .))
স্কট

1

যদি আমাদের সহায়ক স্ক্রিপ্ট তৈরি করার অনুমতি দেওয়া হয় তবে আপনি এমন একটি সহায়ক তৈরি করতে পারেন যা PATH- এ pwd যুক্ত করে, তারপরে চালান

. pathhelper    #adds pwd to path
file            #now it can be run without ./

এটি "যোগ করা এড়ায়।" পথে যেতে এবং আপনার প্রোফাইলে দূষিত করে প্রতিটি পথ দিয়ে আপনি যে কোনও সময়ে কিছু চালাতে চাইবেন।

পরিবর্তিত PATH সহ একটি নতুন শেল প্রবর্তনকারী সাহায্যকারী তৈরি করে আমরা এই পদক্ষেপটি আরও একধাপ এগিয়ে নিয়ে যেতে পারি। যদি এটি কোনও ডিরেক্টরিকে প্যারামিটার হিসাবে নেয় (পিডাব্লুডিকে একটি ডিফল্ট হিসাবে ব্যবহার করে), এটি pushdপথ সম্পাদনা করে এমনটির মতো কাজ করবে। আপনার মনে রাখতে হবে সাবসেলটি প্রস্থান করার সময় অন্যান্য পরিবেশের ভেরিয়েবলের যে কোনও পরিবর্তন হারাতে হবে, তবে দীর্ঘকাল ধরে চলমান শেলের মধ্যে আপনার প্যাথ ভেরিয়েবলটি সমস্ত বিশৃঙ্খল হয়ে উঠবে না। আপনার কর্মপ্রবাহের উপর নির্ভর করে এটি সুবিধাজনক হতে পারে।

:outer shell prompt$; subshellpathhelper    # launches a subshell with modified PATH
: subshell prompt $ ; file                  # in the subshell it can be run without ./

তবে আমি অনুমান করি আপনি যদি এটির সাথে চালাতে চান তবে আপনি হ্যাক করতে পারেন pushdএবং popdতাই তারা সাবসেল না করেই পথে একই পরিবর্তন করতে পারে যা অন্যান্য পরিবর্তনগুলি হারাবে।

pushd --path ~/some/path/    # normal pushd plus adds target to path
file                         # it can be run without ./ until you popd

(আপনি cdএটির সাথে এটি করতে পারবেন না কারণ এর সাথে কোনও এনালগ নেই popd))

আপনি কেবল PATH এন্ট্রিগুলিকে ধাক্কা দিতে এবং পপ করতে কোনও উত্সর্গীকৃত সহায়িকা তৈরি করতে পারেন। কী সর্বোত্তম কাজ করে তা আপনার ব্যবহারের ধরণগুলির উপর নির্ভর করে।


আসলে, আপনি এটির মতো কিছু করতে পারেন cdতবে এটি আরও বাইরে রয়েছে: একটি ফাইল তৈরি করুন .dircmdsএবং স্যুইচ করার আগে ডানদিকে cdকমান্ডগুলি ./.dircmdsউপলভ্য নয় এবং স্যুইচিংয়ের পরে সঠিকভাবে উপলব্ধ করার জন্য হ্যাক করুন ।
শ্যাড স্টার্লিং

-1

আপনি . script.shযে স্ক্রিপ্টটি চালাতে চান তা বর্তমান ডিরেক্টরিতে থাকা পর্যন্ত আপনি সিনট্যাক্স ব্যবহার করতে পারেন ।

আপনি শ বা বাশ এর মতো দোভাষীর সাথে উপসর্গও করতে পারেন। উদাহরণ:bash script.sh


8
. script.shস্ক্রিপ্টটি অন্তর্ভুক্ত থাকলে ভাঙবে exit, অপ্রত্যাশিত প্রভাব রয়েছে যেমন এটি যদি PATH "অস্থায়ীভাবে" পুনরায় সংজ্ঞায়িত হয়; এটি কেবলমাত্র আপনার বর্তমান শেলটির স্ক্রিপ্টগুলির জন্য কাজ করে
সোর্সজেডি

@ সোর্সজেডি সম্পর্কিত exitআপনি এটি প্রথম বন্ধনীর মধ্যে অর্থাত্ একটি সাবসেলের মধ্যে রাখতে পারেন তবে সত্য, এটি এখনও একই শেলের স্ক্রিপ্টগুলির জন্য for
পিএইচকে

প্রশ্নটি "একটি এক্সিকিউটেবল ফাইল" বলে। এগুলি বাইনারি এক্সিকিউটেবলের পক্ষে কাজ করবে না; শুধুমাত্র একটি স্ক্রিপ্টের জন্য। এবং আপনার দ্বিতীয় অনুচ্ছেদে জান্নার উত্তরটিকে নকল করে ।
স্কট

ভাল, আমার খারাপ, আমি বেশিরভাগই দেব বাশ স্টাফকে সম্পাদন করি এবং তাই ধরে নিয়েছি আমরা বাশ স্ক্রিপ্টগুলির বিষয়ে কথা বলছি :)
UltimateByte

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