/ বিন / শ: ধাক্কা: পাওয়া যায় নি


101

আমি একটি মেক ফাইলের মধ্যে নিম্নলিখিতটি করছি

pushd %dir_name%

এবং আমি নিম্নলিখিত ত্রুটি পেয়েছি

/bin/sh : pushd : not found

কেউ দয়া করে আমাকে বলতে পারেন কেন এই ত্রুটিটি প্রদর্শিত হচ্ছে? আমি আমার $ PATH ভেরিয়েবলটি যাচাই করেছি এবং এতে / বিন রয়েছে যাতে আমি মনে করি না যে এটি কোনও সমস্যা সৃষ্টি করছে।


এটি শ সম্পর্কে অভিযোগ করছে না, অভিযোগ করছে এটি খুঁজে পাচ্ছে না pushd। আপনার মধ্যে ধাক্কা আছে $PATH?
কোনারাক

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

আপনি কোডটি সম্পাদনা করলেন কেন?
জানু হুডেক

4
সম্ভবত আপনার ডিস্ট্রো / বিন / বাশের পরিবর্তে / বিন / শ-এ / বিন / ছাইতে চলে গেছে। আপনি যদি আপনার ম্যাসকে ব্যাশ ব্যবহারের জন্য বিশেষভাবে জোর না করেন তবে এটি / বিন / শ যা কিছু ব্যবহার করবে।
stsquad

শ্যাশ স্ক্রিপ্টে একই সমস্যা ঘটতে পারে যদি এটি বাশ দ্বারা কার্যকর না হয়।
ভ্লাদিমির ক্রোজ

উত্তর:


113

pushdbashপসিক্স-নির্দিষ্ট বোর্ন শেলের একটি বর্ধন। pushdকমান্ড হিসাবে সহজেই প্রয়োগ করা যায় না, কারণ বর্তমান ওয়ার্কিং ডিরেক্টরিটি একটি প্রক্রিয়াটির বৈশিষ্ট্য যা শিশু প্রক্রিয়া দ্বারা পরিবর্তন করা যায় না। (একটি অনুমান pushdকমান্ড কল করতে পারেchdir(2) এবং তারপরে একটি নতুন শেল শুরু করতে পারে, তবে ... এটি খুব ব্যবহারযোগ্য হবে না)) pushdঠিক তেমনই একটি শেল বিল্টিন cd

সুতরাং, হয় আপনার স্ক্রিপ্টটি শুরু করতে পরিবর্তন করুন #!/bin/bashঅথবা চলমান কার্যক্ষম ডিরেক্টরিটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করুন, আপনার কাজটি করুন, তারপরে ফিরে যান। নির্ভর করে যদি আপনি শেল স্ক্রিপ্ট চান যা খুব হ্রাসপ্রাপ্ত সিস্টেমে কাজ করে (বলুন, একটি ডেবিয়ান বিল্ড সার্ভার) বা আপনি যদি সর্বদা প্রয়োজন ঠিক থাকেন তবে bash


18
ওপি বলছে এটি মেক থেকে চালানো। সুতরাং এটি SHELL = /bin/bashদিয়ে স্ক্রিপ্ট শুরু করার চেয়ে সেট করা হবে #!/bin/bash
জানু হুডেক

@ জান হুদেক, আহ! ভালো বল ধরা. ধন্যবাদ
sarnold

তবে SHELL সেট করা এই ক্ষেত্রে কাজ করবে না, test1আমার উত্তর দেখুন, stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/…
hlovdal

4
@ হ্লোভডাল: না, সত্যিই এটি যথেষ্ট হবে না।
জানু হুডেক

4
নিশ্চিত করুন যে #!/bin/bashফাইলটির প্রথম লাইন।
মাইকেল কোল

30

যোগ করুন

বিক্রয়: = / বিন / বাশ

আপনার মেকফিলের শীর্ষে আমি এটি অন্য প্রশ্নের উপরে পেয়েছি যে আমি মেকফিল লক্ষ্যগুলিতে বাশ সিনট্যাক্সটি কীভাবে ব্যবহার করতে পারি?


হ্যাঁ ধন্যবাদ. রেড হ্যাটস ডিফল্ট বশ করতে তবে দেবিয়ান এটি সত্যই sh (বা এটির কিছু প্রয়োগ)। এটা আমার সমস্যা ছিল।
lzap

18

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

অর্থাত্

oldpath = `pwd`
আপনার স্ক্রিপ্ট যাই করুক না কেন
...
...
...
আপনি যে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধাক্কা
সিডি $ ওল্ডপাথ

6
আপনি cdযে ডিরেক্টরিটি চান তার মধ্যে এবং তারপরেও cd -করতে পারেন, $oldpathযদি আপনি অভ্যন্তরীণ অভ্যন্তর ব্যবহার না করেন তবে সেই পরিবর্তনশীলটি ব্যবহার করার দরকার নেই cd। মজার বিষয় pushdহ'ল প্রতিবার আপনি এটি ব্যবহার করার সময় ডিরেক্টরিকে একটি স্ট্যাকের দিকে ঠেলে দিচ্ছেন এবং তারপরে আপনি সর্বশেষতম ব্যবহার করে ফিরে যেতে পারেন popd, সুতরাং যখন আপনি একাধিক ডিরেক্টরিতে যাচ্ছেন এবং চান তখন এটি ব্যবহার করা বুদ্ধিমানের বিষয় ফিরে আসার এক নিশ্চিত উপায়
এনরিকো

4
যদি এটি কেবলমাত্র কোনও অনলাইনার থাকে তবে নিম্নলিখিতগুলিও কাজ করতে পারে(cd /new_path ; command )
বার্নি 765

10

এটি কারণ প্যাশড বাশ-এ একটি বিল্টিন ফাংশন। সুতরাং এটি PATH ভেরিয়েবলের সাথে সম্পর্কিত নয় এবং এটি / bin / sh দ্বারা সমর্থিত নয় (এটি মেক দ্বারা ডিফল্টরূপে ব্যবহৃত হয় You আপনি শেলটি সেট করে এটি পরিবর্তন করতে পারেন (যদিও এটি সরাসরি কাজ করবে না (পরীক্ষা 1))।

পরিবর্তে আপনি সমস্ত কমান্ডের মাধ্যমে চালাতে পারেন bash -c "..."। এটি পুশ / পপড সহ কমান্ডগুলিকে বাশ পরিবেশে চালিত করবে (টেস্ট 2)

SHELL = /bin/bash

test1:
        @echo before
        @pwd
        @pushd /tmp
        @echo in /tmp
        @pwd
        @popd
        @echo after
        @pwd

test2:
        @/bin/bash -c "echo before;\
        pwd; \
        pushd /tmp; \
        echo in /tmp; \
        pwd; \
        popd; \
        echo after; \
        pwd;"

টেস্ট 1 তৈরি এবং টেস্ট 2 তৈরির সময় এটি নীচে দেয়:

prompt>make test1
before
/download/2011/03_mar
make: pushd: Command not found
make: *** [test1] Error 127
prompt>make test2
before
/download/2011/03_mar
/tmp /download/2011/03_mar
in /tmp
/tmp
/download/2011/03_mar
after
/download/2011/03_mar
prompt>

টেস্ট 1-এর জন্য, যদিও ব্যাশটি শেল হিসাবে ব্যবহৃত হয়, বিধিতে প্রতিটি কমান্ড / লাইন নিজেই চালিত হয়, সুতরাং পুশ কমান্ডটি পপডের চেয়ে আলাদা শেলের মধ্যে চালিত হয়।


4
@ জান হুডেক, আমি মনে করি tcsh(এবং সম্ভবত csh?) তাদের > $ tcsh haig:/> exit $ csh haig:/> exit $
প্রম্পটগুলি এইটির

আমার না :) আসলে আমার পিএস 1 (\u) \h:\w>কিন্তু আমি কেবল উত্তরটির জন্য এখন এটিকে জেনেরিক স্ট্রিং এ নামিয়ে দিয়েছি। ডস-তে প্রম্পটটি >ডিফল্ট ( $P$Gআইআইআরসি) দিয়ে শেষ হচ্ছে এবং আমি এটি পছন্দ করি।
hlovdal

এর সাথে শেল সেট করুন: = সাথে নয়
কাপ

"শেল = / বিন / বাশ" সেট করা আমার পক্ষে ঠিক কাজ করে, আপনি কীভাবে এটি কাজ না করে তা নিশ্চিত হন না।
আইজাক ফ্রিম্যান


4

আপনার শেল (/ বিন / শ) 'পুশড' সন্ধানের চেষ্টা করছে। তবে এটি খুঁজে পাচ্ছে না কারণ 'পুশড', 'পপড' এবং এর মতো অন্যান্য কমান্ডগুলি বাশনে তৈরি।

আপনি এখন করছেন এর পরিবর্তে বাশ (/ বিন / বাশ) ব্যবহার করে স্ক্রিপ্ট চালু করুন এবং এটি কার্যকর হবে


2

অন্যান্য প্রতিক্রিয়াগুলি থেকে সংশ্লেষকরণ: pushdবাশ-নির্দিষ্ট এবং আপনি তৈরি করছেন অন্য একটি পসিক্স শেল ব্যবহার করছেন। যে অংশটি বিভিন্ন ডিরেক্টরি প্রয়োজন তার জন্য পৃথক শেল ব্যবহার করার জন্য একটি সাধারণ কাজ রয়েছে, সুতরাং কেবল এটিকে এটিতে চেষ্টা করে দেখুন:

test -z gen || mkdir -p gen \
 && ( cd $(CURRENT_DIRECTORY)/genscript > /dev/null \
 && perl genmakefile.pl \
 && mv Makefile ../gen/ ) \
 && echo "" > $(CURRENT_DIRECTORY)/gen/SvcGenLog

(আমি পরিবর্তনশীল প্রসারণের সাথে দীর্ঘ পথটি প্রতিস্থাপন করেছি probably সম্ভবত আমি মেকফিলের মধ্যে একটি এবং এটি বর্তমান ডিরেক্টরিতে স্পষ্টভাবে প্রসারিত হয়েছে)।

যেহেতু আপনি এটি মেক থেকে চালাচ্ছেন, আমি সম্ভবত পরীক্ষাকে একটি মেক রুল দিয়ে প্রতিস্থাপন করব। ঠিক

gen/SvcGenLog :
    mkdir -p gen
    cd genscript > /dev/null \
     && perl genmakefile.pl \
     && mv Makefile ../gen/ \
    echo "" > gen/SvcGenLog

(বর্তমান ডিরেক্টরি উপসর্গটি বাদ পড়েছে; আপনি যে কোনও উপায়ে আপেক্ষিক পথ ব্যবহার করছেন) এবং নিয়মকে কেবল নির্ভর করে না gen/SvcGenLog। এটি কিছুটা বেশি পঠনযোগ্য হবে এবং আপনি এটির genscript/genmakefile.plউপরও নির্ভর করতে পারেন , সুতরাং আপনি স্ক্রিপ্টটি পরিবর্তন করলে Makefileইন genপুনরায় জেনারেট হবে। অবশ্যই যদি অন্য কোনও বিষয়বস্তুকে প্রভাবিত Makefileকরে, আপনিও সেই নিয়মকে নির্ভর করতে পারেন।


2

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


1

"অ্যাপল ইনস্টল বাশ" চালান এটি আপনার প্রয়োজনীয় সমস্ত কিছু ইনস্টল করবে এবং কমান্ডটি কাজ করবে


1

এই কৌশলটি করা উচিত:

( cd dirname ; pwd ); pwd

প্রথম বন্ধনীগুলি একটি নতুন শিশু শেল শুরু করে, সুতরাং cdকেবলমাত্র সন্তানের মধ্যে ডিরেক্টরি পরিবর্তন করে এবং প্রথম বন্ধনীগুলির পরে কোনও কমান্ড সেই ফোল্ডারে চলবে। আপনি প্রথম বন্ধনীর বাইরে গেলে আপনি আগে যেখানে ছিলেন সেখানে ফিরে আসবেন ..


1

এখানে নির্দেশ করার একটি পদ্ধতি

sh -> বাশ

টার্মিনালে এই কমান্ড চালান

sudo dpkg-reconfigure dash

এই পরে আপনি দেখতে হবে

ls -l /bin/sh

বিন্দু / বিন / ব্যাশ (এবং / বিন / ড্যাশ না)

রেফারেন্স

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