নোড স্ক্রিপ্ট চলাকালীন আমার বর্তমান শেল প্রসঙ্গে কাজের ডিরেক্টরি পরিবর্তন করুন


114

আমি যখন আমার নোড.জেএস স্ক্রিপ্টের ওয়ার্কিং ডিরেক্টরিটি একটি বিন স্ক্রিপ্ট থেকে চালানো হয় তখন পরিবর্তনের চেষ্টা করছি। আমার নীচের মতো কিছু রয়েছে:

#!/usr/bin/env node
process.chdir('/Users')

তারপরে আমি যখন এই ফাইলটি দিয়ে চালিত করব তখন ./bin/nodefileএটি সরে যায় তবে বর্তমান শেল প্রসঙ্গে ওয়ার্কিং ডিরেক্টরিটি পরিবর্তিত হয়নি। আমি শেলজও চেষ্টা করেছি , তবে এটিও কাজ করে না।

এই কাজ করতে সবচেয়ে ভালো উপায় কি? আমি বুঝতে পারি এটি কাজ করছে তবে এটি কেবল একটি পৃথক প্রক্রিয়াতে রয়েছে।


আপনার কী প্রমাণ আছে যে সিডব্লিউড পরিবর্তন হয়নি? মনে রাখবেন যে প্রয়োজনীয় পাথগুলি () এবং সিডব্লিউডিতে ব্যবহৃত দুটি পৃথক জিনিস।
জেদী

উইন্ডোজে এটি করার কোনও উপায় আছে?
ফিলিপ

উত্তর:


146

ডিরেক্টরি পরিবর্তন করার সঠিক উপায়টি আসলে সাথে রয়েছে process.chdir(directory)ডকুমেন্টেশন থেকে এখানে একটি উদাহরণ দেওয়া হয়েছে :

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

এটি নোড.জেএস আরইপিএল-তেও পরীক্ষামূলক:

[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'

উফ। হ্যাঁ, আমি যে কমান্ডটি ব্যবহার করছি তা আসলে। যাইহোক, আমি যখন এটি একটি সাধারণ স্ক্রিপ্টে ব্যবহার করি তখনও এটি কাজ করে না বলে মনে হয় (একবারে স্ক্রিপ্টটি প্রস্থান করা হয়ে গেলে আমি এখনও পুরানো ডিরেক্টরিতে আছি) যদি আমি প্রসেসকে ডেস্ক। ডাব্লু () বলি যে আমি ডিরেক্টরিতে আছি তবে আমার হওয়া উচিত টার্মিনাল যদি আমি pwd কল করি আমি অন্যথায় কিছু করছি। কারণ এটি একটি ভিন্ন প্রক্রিয়া?
জোনভোনো

10
পদ্ধতিটি শেলের নয়, প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিকে পরিবর্তন করে । আমি যতদূর জানি, চলমান প্রক্রিয়াটির বাহ্যিক সিডাব্লুডি পরিবর্তন করা বেশ জটিল এবং এটি প্রস্তাবিত নয়। এটি করতে চাওয়ার আপনার কারণ কী?
hexacyanide

3
হুম। ঠিক আছে ধন্যবাদ. ভাল কারণ আমি এটি করতে চাই কারণ আমি আমার প্রকল্পগুলি সংগঠিত করার জন্য একটি টার্মিনাল অ্যাপ তৈরি করছি। সুতরাং মূলত আমি আমার প্রকল্পগুলি তালিকাভুক্ত করতে এবং সহজেই বর্তমান শেলটির অবস্থানটিকে এতে পরিবর্তন করতে সক্ষম হতে চাই। এখন যেহেতু আমি এটি সম্পর্কে চিন্তা করি, আমি কীভাবে z ( github.com/rupa/z ) এটি করে তা খতিয়ে দেখতে যাচ্ছি । যদিও এটি ব্যাশ করা হয়। আমি সম্ভবত এটি আপেলস্ক্রিপ্ট করতে পারি?
জোনভোনো

@ হেক্সাসায়ানাইড যোগ করার জন্য ধন্যবাদ বিরক্তিকর ছিল কারণ পরিবর্তনগুলি সারিবদ্ধ হয়নি
ইউজেন সানিক

33

নোড প্রক্রিয়া চলমান অন্তর্নিহিত শেলের সিডাব্লুডি পরিবর্তন করার জন্য নোডের কোনও অন্তর্নির্মিত পদ্ধতি নেই।

আপনি কমান্ডের মাধ্যমে নোড প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে পারেনprocess.chdir()

var process = require('process');
process.chdir('../');

নোড প্রক্রিয়াটি উপস্থিত থাকলে, আপনি সিডাব্লুডিতে নিজেকে ফিরে পাবেন আপনি প্রক্রিয়াটি শুরু করেছিলেন।


14

আপনি যা করার চেষ্টা করছেন তা সম্ভব নয়। এর কারণ হ'ল কোনও পসিক্স সিস্টেমে (লিনাক্স, ওএসএক্স, ইত্যাদি) কোনও শিশু প্রক্রিয়া পিতামাতার প্রক্রিয়ার পরিবেশ পরিবর্তন করতে পারে না। এর মধ্যে প্যারেন্ট প্রসেসের ওয়ার্কিং ডিরেক্টরি এবং পরিবেশের ভেরিয়েবলগুলি সংশোধন করা অন্তর্ভুক্ত includes

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

এর অনেকগুলি কারণ রয়েছে, তবে একটির জন্য, আপনি কল্পনা করুন যে আপনি একটি স্ক্রিপ্টটি পটভূমিতে (মাধ্যমে ./foo.js &) সম্পাদন করেছেন এবং এটি চলার সাথে সাথে এটি আপনার কার্যকরী ডিরেক্টরি পরিবর্তন করতে শুরু করেছে বা আপনার ওভাররাইড করে PATH। এটি একটি দুঃস্বপ্ন হবে।

আপনার যদি শেলটির কার্যক্ষম ডিরেক্টরি পরিবর্তন করার প্রয়োজন হয় তবে আপনার শেলটিতে একটি ফাংশন লিখতে হবে। উদাহরণস্বরূপ, আপনি যদি বাশ চালাচ্ছেন তবে আপনি এটি এতে রাখতে পারেন ~/.bash_profile:

do_cool_thing() {
  cd "/Users"
  echo "Hey, I'm in $PWD"
}

এবং তারপরে এই দুর্দান্ত জিনিসটি করণীয়:

$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users

যদি আপনাকে আরও জটিল জিনিসও করার দরকার হয় তবে আপনি সর্বদা সেই ফাংশন থেকে আপনার নোডেজ স্ক্রিপ্টে কল করতে পারেন।

আপনি যা করতে চেষ্টা করছেন তা কেবলমাত্র এটিই আপনি সফল করতে পারেন।


10

সংক্ষিপ্ত উত্তর: কোন (সহজ?) উপায় নয়, তবে আপনি এমন কিছু করতে পারেন যা আপনার উদ্দেশ্যকে পরিপূর্ণ করে।

আমি একটি অনুরূপ সরঞ্জাম (একটি ছোট কমান্ড যা কোনও প্রকল্পের বর্ণনা দিয়ে পরিবেশ, পথ, ডিরেক্টরি ইত্যাদি নির্ধারণ করে) সম্পন্ন করেছি। আমি যা করি তা হ'ল সবকিছু সেট আপ করা এবং তারপরে একটি শেল স্প্যান করে:

spawn('bash', ['-i'], {
  cwd: new_cwd,
  env: new_env,
  stdio: 'inherit'
});

মৃত্যুদন্ড কার্যকর হওয়ার পরে, আপনি নতুন ডিরেক্টরি (এবং, আমার ক্ষেত্রে, পরিবেশ) সহ শেল থাকবেন। আপনার পছন্দ অনুযায়ী শেলটির জন্য আপনি বাশ পরিবর্তন করতে পারেন। আপনি মূলত যা চেয়েছিলেন তার সাথে প্রধান পার্থক্যগুলি হ'ল:

  • একটি অতিরিক্ত প্রক্রিয়া আছে, তাই ...
  • ফিরে আসতে আপনাকে 'প্রস্থান' লিখতে হবে, এবং তারপরে ...
  • বিদ্যমান থাকার পরে, সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরে আসে।

যাইহোক, আমার জন্য, যে পার্থক্যগুলি কাম্য।

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