লিনাক্স শেল থেকে বর্তমান থেকে আলাদা ওয়ার্কিং ডিরেক্টরি সহ আমি কীভাবে একটি প্রোগ্রাম চালাব?


351

একটি লিনাক্স শেল ব্যবহার করে , আমি বর্তমান ওয়ার্কিং ডিরেক্টরি থেকে আলাদা ওয়ার্কিং ডিরেক্টরি দিয়ে একটি প্রোগ্রাম কীভাবে শুরু করব?

উদাহরণস্বরূপ, আমি একটি বাইনারি ফাইল আছে helloworldযে ফাইল তৈরি করে hello-world.txtএর মধ্যে বর্তমান ডিরেক্টরী

এই ফাইলটি ডিরেক্টরি ভিতরে আছে /a

বর্তমানে, আমি ডিরেক্টরিতে আছি /b। আমি আমার প্রোগ্রামটি চালু করতে ../a/helloworldএবং hello-world.txtতৃতীয় ডিরেক্টরিতে কোথাও পেতে চাই /c


5
কোনও হার্ড কমান্ড suচালানোর আগে আপনি নির্ধারিত ব্যবহারকারীর হোম ডিরেক্টরিতে ওয়ার্কিং ডিরেক্টরিটি পুনরায় সেট করার জন্য আমি শক্তভাবে আবিষ্কার করেছি -c। এটি আমার পক্ষে খুব সহায়ক ছিল।
প্যাট্রিক এম

উত্তর:


560

প্রোগ্রামটিকে এভাবে কল করুন:

(cd /c; /a/helloworld)

বন্ধনীগুলির ফলে একটি উপ-শেল তৈরি হয়েছে। এই সাব-শেল তারপর তার কাজ ডিরেক্টরি পরিবর্তন /c, তারপর executes helloworldথেকে /a। প্রোগ্রামটি প্রস্থান করার পরে, উপ-শেলটি সমাপ্ত হবে, আপনি যে ডিরেক্টরি থেকে শুরু করেছেন সেই ডিরেক্টরিতে আপনাকে প্যারেন্ট শেলের প্রম্পটে আপনাকে ফিরিয়ে দেবে।

ত্রুটি পরিচালনায়: ডিরেক্টরিটি পরিবর্তন না করেই প্রোগ্রামটি চালনা এড়াতে, উদাহরণস্বরূপ যখন ভুল বানান করা হয়েছে /c, helloworldশর্তসাপেক্ষে কার্যকর করুন :

(cd /c && /a/helloworld)

মেমোরির ব্যবহার হ্রাস করা: হ্যালো ওয়ার্ল্ড কার্যকর হওয়ার সময় সাব-শেল বর্জ্য মেমরি এড়াতে, এক্সিকিউটের helloworldমাধ্যমে কল করুন:

(cd /c && exec /a/helloworld)

[ এই উত্তরটি উন্নত করার বিষয়ে টিপস দেওয়ার জন্য জোশ এবং জুলিয়ানোকে ধন্যবাদ !]


1
এই শেলটিতে আর্গুমেন্টগুলি পাস করার কোনও উপায়? যেমন $ 1, এবং $ 2?
ফাইনিটেলুপ

2
@ সেগফোল্ট: সাব-শেলটির আশেপাশের সুযোগগুলিতে সম্পূর্ণ অ্যাক্সেস রয়েছে।
ডেভিড স্মিট

দেখে মনে হচ্ছে এটি কোনওভাবেই সেই ডিরেক্টরিতে অস্থায়ীভাবে আছে, তাই না?
dhein

1
আপনি $ *, $ @ বা "$ @" করে সমস্ত যুক্তি পাস করতে পারেন (আপনি যদি ডাবল কোটকে সম্মান জানাতে যুক্তি চান)
মার্সেল ভালদেজ ওরোজকো

1
আমি যদি এই লাইনটি /etc/rc.d/rc.local এ যুক্ত করি তবে কি এটি কাজ করবে?
প্রতীক পাতিল

95

অনুরূপ ডেভিড স্মিট এর উত্তর, প্লাস জোশ এর পরামর্শ, কিন্তু একটি শেল প্রক্রিয়া চলমান ছাড়বে না:

(cd /c && exec /a/helloworld)

আপনি শেলটিতে সাধারণত কমান্ডগুলি চালনা করেন তার সাথে এই উপায়টি আরও সাদৃশ্যপূর্ণ। ব্যবহারিক পার্থক্যটি দেখতে, আপনাকে ps efপ্রতিটি সমাধান সহ অন্য শেল থেকে চালাতে হবে ।



25

একটি বিকল্প যার জন্য সাবশেলের প্রয়োজন নেই এবং ব্যাশে অন্তর্নির্মিত

(pushd SOME_PATH && run_stuff; popd)

ডেমো:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

1
অনুরূপ পরামর্শটি নিচে সাহিলও করেছেন। কমান্ড ব্যর্থ হলে এটি কাজ করে না। বিবেচনা করুন pushd SOME_PATH && run_stuff && popd- যদি রান_স্টাফ ব্যর্থ হয় তবে পপড কার্যকর হবে না।
আন্তন ডানিয়েকো

দেরিতে উত্তর, এটি ব্যাশ ফাইলের সেটিংসের উপর নির্ভর করে। ব্যস ব্যর্থ কমান্ডের পরেও কমান্ডগুলি চালিয়ে যেতে পারে (&& ব্যবহারের বিপরীতে), তবে এটি set -eফাইলটিতে এটি না করার জন্য সেট করা যেতে পারে এবং এটি ব্যর্থ হবে popd
লরেন

8
তবুও, আমি pushd "${SOME_PATH}" && run_stuff; popdবর্তমানের উত্তরের চেয়ে ভাল বলে মনে করি , যেহেতু পুশড / পপড শব্দার্থবিজ্ঞানগুলি নির্দিষ্টভাবে কোনও ডিরেক্টরিতে যাওয়ার এবং তারপরে মূলটির কাছে ফিরে আসার এই পরিস্থিতির জন্য বিশেষভাবে তৈরি করা হয়েছিল।
মার্সেল ভালদেজ ওরোজকো

এটি কীভাবে ওরফে হিসাবে সংজ্ঞায়িত হিসাবে কাজ করবে এবং আমাকে একটি পরম পাস করতে হবে?
ডাবিবি

আমি মনে করি যে আপনাকে একটি শেল স্ক্রিপ্ট লিখতে হবে যাতে আপনি যে পরামিতিটি পাস করবেন যা কমান্ডের সিরিজটি কার্যকর করবে কারণ আপনি একটি উলামের মাঝখানে কোনও প্যারামিটার পাস করতে পারবেন না। এটি লেখার জন্য যদি আপনার সাহায্যের প্রয়োজন হয় তবে আপনার একটি পৃথক প্রশ্ন জিজ্ঞাসা করা উচিত এবং এটিকে উল্লেখ করা উচিত। শেল স্ক্রিপ্টটি একবার হয়ে গেলে, আপনি আপনার নতুন স্ক্রিপ্টটি কল করতে একটি উপনাম লিখতে পারেন।
লরেন

19
sh -c 'cd /c && ../a/helloworld'

1
এটি নিখরচায় কার্যকরী ডিরেক্টরিতে কারাগারের অভ্যন্তরে একটি কমান্ড কার্যকর করতে ফ্রিবিএসডি এর জেক্সেকের জন্য ব্যবহার করুন।
মারিওন আর্নে

11

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

$ সিডি ~ / বি

$ ~ / একটি / হেলিওরল্ড> ~ / সি / হেলিওরল্ড.টিএসটিএসটি


6
সঠিক হওয়ার জন্য +1, যদিও উত্তরটি কেবল পেরিফেরিয়ালি একটি উত্তর।
ডেভিড স্মিট

8

কেবলমাত্র সর্বশেষ "&&" ને "" তে পরিবর্তন করুন; কমান্ড ব্যর্থ হয় বা সফল হয় তবে তা সিডি ফিরে আসবে না:

cd SOME_PATH && run_some_command ; cd -

4

এটি করার একটি উপায় হ'ল একটি র‌্যাপার শেল স্ক্রিপ্ট তৈরি করা।

শেল স্ক্রিপ্ট বর্তমান ডিরেক্টরিটি / সি তে পরিবর্তন করবে, তারপরে / এ / হেলিওর্ল্ড চালাবে। শেল স্ক্রিপ্টটি একবার বের হয়ে গেলে, বর্তমান ডিরেক্টরিটি আবার / বিতে ফিরে আসে।

এখানে একটি বাশ শেল স্ক্রিপ্ট উদাহরণ রয়েছে:

#!/bin/bash
cd /c
/a/helloworld

2

কেন এটি সহজ রাখা না

cd SOME_PATH && run_some_command && cd -

সর্বশেষ সিডি কমান্ড আপনাকে শেষ পিডব্লিউডি ডিরেক্টরিতে নিয়ে যাবে। এটি সমস্ত * নিক্স সিস্টেমে কাজ করা উচিত।


আপনি @ মেঝাকা লিখছেন, তা বিবেচনা করা উচিত ছিল :)
সাহিল

1
সতর্কতা: run_some_commandব্যর্থ হলে cd -কার্যকর করা হবে না।
স্টারবিয়াম্রেনবোলাব

1

আপনি যদি সর্বদা এটি সি / এ যেতে চান তবে আপনি ফাইলটি লেখার সময় একটি পরম পথ ব্যবহার করুন।


0

আপনি যদি আপনার প্রোগ্রামের ভিতরে এটি সম্পাদন করতে চান তবে আমি এমন কিছু করব:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

তিনি এটি শেল-স্ক্রিপ্টে করতে চান, এবং সি-তে নয়, বাইনারি ফাইলটি সাব-প্রসেস করা একটি ভয়াবহ ধারণা হবে।

-1

বর্তমান ডিরেক্টরি থেকে কমান্ডটি কার্যকর করতে স্ক্রিপ্ট ডিরেক্টরিটির সম্পূর্ণ পথ সরবরাহ করে

/root/server/user/home/bin/script.sh

1
এটি কার্যকারী ডিরেক্টরিটি মোটেও পরিবর্তন করে না - আমি মনে করি আপনি যা জিজ্ঞাসা করেছেন তার একটি আলাদা প্রশ্নের উত্তর দিচ্ছেন।
টবি স্পিড

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