কেন "সিডি" শেল স্ক্রিপ্টে কাজ করে না?


43

আমি কেবল একটি স্ক্রিপ্ট লিখতে চাই যা আমার ডিরেক্টরি পরিবর্তন করে

আমি নীচের কমান্ডগুলি ফাইলটিতে রেখেছি /home/alex/pathABC

#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld

আমি করেছি chmod +x pathABC

টার্মিনালে, /home/alexআমি চলাকালীন ./pathABC, তবে আউটপুটটি ঠিক থাকে HelloWorldএবং বর্তমান ডিরেক্টরিটি পরিবর্তন হয় না।

তাহলে কি ভুল?


উত্তর:


74

অন্যরা যেমন ব্যাখ্যা করেছে, ডিরেক্টরিটি আপনার স্ক্রিপ্টের চাইল্ড প্রসেসে পরিবর্তিত হয়, টার্মিনাল প্রক্রিয়া থেকে নয় যেখানে স্ক্রিপ্ট বলা হয়। শিশু প্রক্রিয়াটি মারা যাওয়ার পরে, আপনি টার্মিনালে ফিরে এসেছিলেন যেখানে এটি যেখানে ছিল সেখানেই রেখে দেওয়া হয়।

বেশ কয়েকটি বিকল্প:

1. প্রতীকী লিঙ্ক

আপনি সহজে অ্যাক্সেস করতে চান দীর্ঘ পথে আপনার বাড়িতে একটি সিমিলিংক রাখুন

$ ln -s /home/alex/Documents/A/B/C ~/pathABC

তারপরে ডিরেক্টরিটি অ্যাক্সেস করুন:

$ cd ~/pathABC

2. উপন্যাস

আপনার ~ / .bashrc এ একটি নাম রাখুন:

alias pathABC="cd /home/alex/Documents/A/B/C"

(থেকে এখানে )

3. ফাংশন

ডিরেক্টরি পরিবর্তন করে এমন একটি ফাংশন তৈরি করুন, ফাংশনটি আপনার টার্মিনালের প্রক্রিয়ায় চলে এবং এরপরে এটি ডিরেক্টরি পরিবর্তন করতে পারে।

(থেকে এখানে )

৪. শিশু হিসাবে দৌড়ানো থেকে বিরত থাকুন

আপনার স্ক্রিপ্টটি চালানোর পরিবর্তে উত্স করুন। সোর্সিং (এর দ্বারা সম্পন্ন .বা source) এর ফলে স্ক্রিপ্টটি তার নিজের সাবশেলে না চলার পরিবর্তে একই শেলের মধ্যে সম্পাদিত হয়।

$ . ./pathABC

(থেকে এখানে এবং এখানে )

5. সিডি-সক্ষম বারসমূহ

cdable_varsআপনার মধ্যে বিকল্পটি সেট করুন ~/.bashrcএবং ডিরেক্টরিতে একটি পরিবেশের পরিবর্তনশীল তৈরি করুন:

shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"

তারপরে আপনি ব্যবহার করতে পারেন cd pathABC

(থেকে এখানে )


15
এখন বুঝতে পারছি এর ব্যবহার source! আমি সর্বদা ভাবতাম কেন আমি করি source .bashrcএবং করব নাbash .bashrc
হাইট্রোমো

বিকল্প 3 দুর্দান্ত কাজ করেছে। আমি আমার স্ক্রিপ্টের শুরুতে go_to_wherever () my সিডি আমার / ডিরেক্টরি} সেই ডিরেক্টরিতে অপারেশন চালানোর আগে এটিকে কল করে।
i2097i

> 5. সিডি-সক্ষম ওয়ার্স - তাই না cd $pathABC?
লক্স্যাক্স

7

আপনি যখন টার্মিনালে স্ক্রিপ্টটি চালান, তখন একটি শিশু প্রক্রিয়া চলে। এই শিশু প্রোগ্রামে আপনার স্ক্রিপ্ট যা নির্দিষ্ট ডিরেক্টরিতে পরিবর্তিত হবে। তবে প্যারেন্ট প্রসেসে অর্থাৎ যেখানে আপনি স্ক্রিপ্টটি চালাচ্ছেন এটি এখনও পুরানো পথে রয়েছে। অথবা কেবলমাত্র আমরা বলতে পারি:

The scope of cd command is only for child process not parent


2
এটি যুক্ত করে, আপনি যা যা সন্ধান করছেন তা অর্জন করার জন্য @ অ্যালেক্স আপনার পিতা-মাতার প্রক্রিয়াটির মধ্যে স্ক্রিপ্টটি উত্সাহিত করে এটি কার্যকর করুন: হয় . pathABCবা হয় source pathABC
zwets

4

আপনি একটি চিন্তা ত্রুটি করছেন। বর্তমান শেল একই ডিরেক্টরিতে থাকা অবস্থায় স্ক্রিপ্টটি নতুন ডিরেক্টরিতে চলে গেছে।

ডিরেক্টরিতে পরিবর্তন হওয়ার পরে আপনি নতুন ডিরেক্টরিতে অন্য স্ক্রিপ্ট তৈরি করে এবং এটি আপনার স্ক্রিপ্ট থেকে চালিয়ে দেখতে পেয়েছেন:

#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)

দ্বিতীয় স্ক্রিপ্টটি নতুন ডিরেক্টরি থেকে চলবে।

HelloWorld 

শুধুমাত্র স্ক্রিপ্টের আউটপুট।


3
হ্যালো ওয়ার্ল্ড প্যারেন্ট শেলটিতে "ফিরিয়ে" দেওয়া হয়নি, এটি স্ট্যান্ডার্ড আউটপুট থেকে আসে
মগ

pwdপরিস্থিতিটিতে সম্পূর্ণ নতুন স্ক্রিপ্ট যুক্ত করার পরিবর্তে আপনি যদি কেবল নতুন ডিরেক্টরিতে চালিত হন তবে আরও পরিষ্কার হতে পারে ।
wjandrea

0

কারণ হ্যালো ওয়ার্ল্ড হ'ল একটি ট্রেস স্টেটমেন্ট, আসুন এটি চেষ্টা করুন:

এতে থাকা বাশ স্ক্রিপ্ট ফাইল তৈরি করুন cd.sh:

#!/bin/bash
echo "/home/mike/Documents/A/B/C"
  • .shএক্সটেনশন ব্যাশ স্ক্রিপ্ট দেবার একটি পুরোনো কনভেনশন একটি এক্সটেনশন ফাইলগুলির নাম নেই। এটি নিখুঁতভাবে প্রসাধনী এবং সাধারণত অপ্রয়োজনীয়। তবে এক্ষেত্রে কোর cdকমান্ড থেকে আলাদা হওয়া জরুরী ।

ব্যাশ স্ক্রিপ্ট ফাইলটি কার্যকর করে ব্যবহারযোগ্য হিসাবে চিহ্নিত করুন:

chmod a+x cd.sh

এখন ফাইলটি চালান:

$ cd $(./cd.sh)
bash: cd: /home/alex/Documents/A/B/C: No such file or directory
  • cd আমরা সবাই জানি.
  • $(...) বন্ধনীতে কমান্ড কার্যকর করে আউটপুট দেয় returns
  • যদি cd.shআপনার পথে থাকে তবে এটি কোথায় রয়েছে তা নির্দিষ্ট করার দরকার নেই। ./কমান্ডটি সুনির্দিষ্ট করতে আমরা উপসর্গ বর্তমান ডিরেক্টরিতে রয়েছি।
  • echoথেকে আউটপুট cd.shস্ক্রিপ্ট মাধ্যমে পিতা বা মাতা ফেরত পাঠানো হয় $(...)। প্যারেন্ট (আমাদের শেল প্রম্পট) এই আউটপুটটি ব্যবহার করে এবং এটি লিনাক্স cdকমান্ডে প্রেরণ করে ।

অন্যরা যেমন উল্লেখ করেছে যে কোনও শিশু প্রক্রিয়া পিতামাতার ডিরেক্টরি পরিবর্তন করতে পারে না। প্রক্রিয়া শেষ হওয়ার পরে কোথায় যেতে হবে বাচ্চাটি তার পিতামাতাকে বলতে পারে এই এক উপায়।


@wjandrea আপনি ফোনে কোডিংয়ের জন্য এটি পান! সবে বাসায় উঠলাম, ঠিক করে দেব। ধন্যবাদ। উম সবেমাত্র যাচাই করা হয়েছে এবং এটি ঠিক আছে। সম্ভবত এটি আপনার 14.04সংস্করণ আমি প্রায় এক ঘন্টা আগে পড়েছি বা তাই?
WinEunuuchs2 ইউনিক্স

ঠিক আছে, আপনি সম্পূর্ণ স্ক্রিপ্টটি পরিবর্তন করেছেন। পূর্বে এটি কেবল একটি আদেশ ছিল: cd /home/mike/Documents/A/B/Cযা কোনও আউটপুট উত্পাদন করে না। এখন এটি echo "/home/mike/Documents/A/B/C", যা আউটপুট উত্পাদন করে।
wjandrea

@ ওজান্দ্রিয়া সত্য, আমি স্ক্রিপ্টটি কল করার পদ্ধতিও পুরোপুরি পরিবর্তন করেছি। সরল পরিবর্তে ./cd.shএটি এখন cd $(./cd.sh)কিন্তু এটি সন্তানের পিতামাতার বর্তমান ডিরেক্টরি পরিবর্তন করার লক্ষ্যটি অর্জন করে। হ্যাঁ এটি প্রচলিত কিন্তু এটি করার অন্য একটি উপায় যা আমি আশা করি লোকেরা আকর্ষণীয় find
WinEunuuchs2Unix
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.