বাশ স্ক্রিপ্টে সমস্যা: 'ঘোষণা করুন: পাওয়া যায়নি'


23

আমার কাছে একটি স্ক্রিপ্ট ছিল যা ঠিকঠাক চলছিল তবে আজ আমি যখন এটি চালাচ্ছি, এটি বলে declare: not found। স্ক্রিপ্টের শুরুতে আমি ব্যাশ শেল এবং পাথটি ব্যবহার করছি সঠিক।

আমার স্ক্রিপ্টে দুটি পতাকাযুক্ত রেখা নিম্নরূপ:

declare -a RESPONSE
RESPONSE=($RESULT)

এটি (অপ্রত্যাশিত বলেও বলেছে তবে আমার ধারণা প্রথম ত্রুটির কারণে এটি সামনে আসছে। উল্লেখযোগ্য পয়েন্টটি যখন আমি টাইপ করি তখন সরাসরি কাজ করে সূক্ষ্ম কাজ করে।

declare | grep USER শো

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

তো, এখানে কি ভুল?

উত্তর:


27

আপনি কি shপরিবর্তে ব্যবহার করছেন bash? sh(লিঙ্কযুক্ত dash) declareকীওয়ার্ড এবং সিনট্যাক্স সমর্থন করে না

VAR=(list) 

অ্যারে শুরু করার জন্য।


আমার শেবাং লাইনটি #!/bin/bashকেবলমাত্র। আপনি কী বোঝাতে চেয়েছিলেন আমি কীভাবে এটি সম্পাদন করব? আমি কেবল এটি কার্যকর করার চেষ্টা করেছি ./script.shএবং এটি কাজ করেছে। তবে এটি কাজ করে না script.shবা হিসাবে কাজ করে না sh script.shএবং আমি বেশ নিশ্চিত যে আমি এক সপ্তাহ আগে এটি তৈরি করার সময় কেবলমাত্র দুটি পরবর্তী পদ্ধতি ব্যবহার করেছি। কী তা ব্যাখ্যা করতে পারে?
আশফেম

@ আশফাম: সম্ভবত এক সপ্তাহ আগে এটি আপনার কাছে থাকা বাশের নির্দিষ্ট বৈশিষ্ট্যগুলি মিস করেছে, তাই এটি sh
স্ক্রিপ্ট.শ এর

না আমি বোঝাতে চাইছিলাম ঠিক এই স্ক্রিপ্টটি এক সপ্তাহ বা দুই সপ্তাহ আগে ব্যবহৃত হয়েছিল। অথবা আপনি বোঝাতে চেয়েছিলেন যে কোনও আপডেটে কোনও পরিবর্তন এসেছে?
আশফাম

@ আশফাম: আমি জানি না, এই স্ক্রিপ্টটি আপনি এখন এটি দেখানোর সাথে সাথে sh স্ক্রিপ্ট.শ দিয়ে কাজ করতে পারবেন না।
enzotib

11

আমি সন্দেহ করি যে আপনার "শেবাং" লাইনটি (ফাইলটির firstচ্ছিক প্রথম লাইন) এর shপরিবর্তে উল্লেখ করা হচ্ছে bash। এটা করা উচিত

#!/bin/bash

বাশ স্ক্রিপ্টগুলির জন্য। আপনার স্ক্রিপ্টের প্রথম লাইনটি যদি হয়

#!/bin/sh

তারপরে এটি ইঙ্গিত দেয় যে কঠোরভাবে বোর্ন-সামঞ্জস্যপূর্ণ শেলটি ব্যবহার করতে হবে; উবুন্টু ক্ষেত্রে dashব্যবহার করা হয়। অন্যান্য অনেক বিতরণে এটি কোনও সমস্যা করে না কারণ তারা লিঙ্ক /bin/shকরে /bin/bash; তবে /bin/dashসিস্টেম স্ক্রিপ্টগুলি আরও দ্রুত চালিত হওয়ার জন্য উবুন্টু লিঙ্ক করে ।

declareBuiltin এক bashবোর্ন শেল স্ক্রিপ্ট স্পেসিফিকেশন এর অনেক এক্সটেনশন; dashকেবল এক্সটেনশন ছাড়াই সেই স্পেসিফিকেশনটি প্রয়োগ করে।


আমার #!/bin/bash
শেবাং

@ আশফাম: আপনি কীভাবে স্ক্রিপ্টটি চালাচ্ছেন? আপনি যদি কেবল স্ক্রিপ্টের নাম টাইপ করে এটি প্রার্থনা করছেন তবে শেবাং লাইনটি দোভাষী কী তা চালিয়ে যাবে তা নির্ধারণ করবে। তবে, আপনি যদি স্পষ্টভাবে এর মাধ্যমে আবেদন করেন sh thescript.shতবে shশেল - অর্থাৎ dashএটি ব্যাখ্যা করবে it
intuited

1
@intuited আমি এটা মাধ্যমে চলমান ছিল sh script.sh। আপনি যা বলেছেন তা আমি বুঝতে পেরেছি, তবে আমি কোথাও পড়েছি যে এই পদ্ধতিটি দিয়ে bashএটি ব্যাখ্যা করবে। কেন dashএটি এখানে ভূমিকা পাবেন? এটা কি কেবল উবুন্টুর সাথেই আছে? আমি যা পড়ি তা সাধারণভাবে লিনাক্সের জন্য ছিল।
আশফাম

2
@ আশফেম আপনার সাথে sh scriptকমান্ডটি shআর্গুমেন্টের সাথে চালাচ্ছেন scriptযা এই ফাইলের কমান্ডগুলি পড়তে এবং সম্পাদন করতে সক্ষম করে। শেবাং sh দ্বারা পড়া হয় না, এটি একটি দিয়ে শুরু হয় #, সুতরাং এটি একটি মন্তব্য হিসাবে বিবেচিত হবে। আপনি যদি এর পরিবর্তে চালনা করেন ./script, তবে কার্নেলটি #!/bin/bash/bin/bash ./script
শেবাংটি

@ গিরাহ হ্যাঁ আমি কীভাবে জানি এটি কার্যকর তবে এটি dashব্যবহার করা হবে বলে উল্লেখ করা হয়েছে, সুতরাং আমার এটি পরিষ্কার করা দরকার
আশফাম

3

উপরের ত্রুটিটি কীভাবে পুনরুত্পাদন করবেন:

আমি উবুন্টু 14.04 64 বিট ব্যবহার করছি। এই কোডটি একটি ফাইলে রাখুন:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

এটি এইভাবে চালান:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

এটি ঠিক করতে, পরিবর্তে এটি করুন:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

ছাপে:

el@apollo:~$ ./06.sh 
12

1

আমারও একই সমস্যা ছিল এবং তার পরে আমি মনে রেখেছিলাম যে শেল স্ক্রিপ্টটি সম্পাদন করার জন্য আপনাকে সঠিক অনুমতিগুলি দেওয়া দরকার।

স্ক্রিপ্টের অনুমতি পরিবর্তন করুন, উদাহরণস্বরূপ:

chmod 755 script.sh

1

/bin/bashপরিবর্তে কমান্ড লাইনে আপনার স্ক্রিপ্টটি চালানোর চেষ্টা করুন যদি sh(:

পরিবর্তে :

    shcript.sh

চেষ্টা করুন:

    / বিন / বাশ স্ক্রিপ্ট.শ

1

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

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

সব পরিবর্তন sh some_script.shকরতে $SHELL some_script.shএটি সংশোধন করা হয়েছে।

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