একটি "দ্ব্যর্থক পুনর্নির্দেশ" ত্রুটি পাওয়া


173

আমার বাশ স্ক্রিপ্টে নিম্নলিখিত লাইন

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

আমাকে এই ত্রুটি দেয়:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

কেন?


10
আপনি সব দেখাচ্ছে না। যেখানে আপনি পেতে পারি ${OUPUT_RESULTS}। এটির একটি বানান $OUTPUT_RESULTS}
ত্রুটিও

যদি কেউ একটি লিখে থাকে তবে OUPUT_RESULTS = "filename.log"দ্ব্যর্থহীন পুনর্নির্দেশ হবে। কারণ বাশ =অপারেটরের আশেপাশে কোনও স্পেস চায় না ।
পোট্রাথর

উত্তর:


269

বাশ কখনও কখনও সুন্দর অবসন্ন হতে পারে।

নিম্নলিখিত কমান্ডগুলি সমস্ত একই ত্রুটির জন্য পৃথক পৃথক ত্রুটি বার্তা প্রদান করে:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

ভেরিয়েবলের চারপাশে উদ্ধৃতি যুক্ত করা "অস্পষ্ট পুনঃনির্দেশ" বার্তাটি মোকাবেলা করার একটি ভাল উপায় বলে মনে হচ্ছে: আপনি যখন টাইপিংয়ের ভুল করেছেন তখন আপনি আরও ভাল বার্তা পাবেন - এবং ত্রুটিটি যখন ফাইলের নাম ফাঁক হওয়ার কারণে হয়, উদ্ধৃতি ব্যবহার করা ঠিক করা।


1
আপনি যদি পুনর্নির্দেশগুলি ধারণ করে এমন কোনও স্ক্রিপ্টের আউটপুট পুনর্নির্দেশ করেন তবে আপনি এটিও পাবেন। আমাকে জিজ্ঞাসা করবেন না আমি এটি কীভাবে জানি।
পল জ্যাকসন

@ পলজ্যাকসন, ... এটি সত্য নয়। অনুলিপি-অনুলিপি প্রদর্শক হিসাবে: sh -c 'echo hello >/tmp/hello' >/tmp/worldসঠিকভাবে কাজ করে।
চার্লস ডাফি 19

24

আপনার কি ভেরিয়েবলের নাম আছে OUPUT_RESULTSনাকি এর বেশি সম্ভাবনা রয়েছে OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 

2
যদি আপনার হয় তবে ABC="junk file.txt"এই সমস্যাটি এখনও থাকবে।
চার্লস ডাফি

15

আপনার পরিবর্তনশীল চারপাশে উদ্ধৃতি রাখুন। যদি এটির ফাঁকা জায়গা থাকে তবে এটি আপনাকে "অস্পষ্ট পুনঃনির্দেশ "ও দেবে। আপনার বানানও পরীক্ষা করুন

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

যেমন অস্পষ্ট পুনঃনির্দেশ

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag

1
উক্তি কোন বিষয় নয়। ভেরিয়েবল প্রসারণে ফাঁকা স্থান উপস্থিত থাকলে আপনি কেবলমাত্র ফাইলের নাম এবং / অথবা উত্সাহযুক্ত ত্রুটি বার্তাগুলি ফাইলের নামের পরবর্তী স্থানের সাথে জড়িত জিনিসগুলি পাবেন।
আমার সঠিক মতামত

@ জাস্টএমওয়াইক্র্যাক্টপিনেশন, শেলটি প্যারামিটার বিস্তারের পরে পুনরায় পার্স করবে না - এর অর্থ হ'ল সম্প্রসারণের ফলাফলের মধ্যে স্থানের পরে থাকা সামগ্রীগুলি সিনট্যাক্সের বিভিন্ন অংশে পূর্ণ হতে পারে না
চার্লস ডাফি ১৯

5

আমি সম্প্রতি খুঁজে পেয়েছি যে রিডাইরেক্ট ফাইলের নামে ফাঁকা স্থানগুলি "দ্ব্যর্থক পুনর্নির্দেশ" বার্তা তৈরি করবে।

উদাহরণস্বরূপ আপনি যদি পুনর্নির্দেশ করেন application$(date +%Y%m%d%k%M%S).logএবং আপনি ভুল ফর্ম্যাটিং চরিত্রগুলি নির্দিষ্ট করে থাকেন, উদাহরণস্বরূপ পুনর্নির্দেশটি সকাল 10 টার আগে ব্যর্থ হবে। তবে, আপনি application$(date +%Y%m%d%H%M%S).logএটি ব্যবহার সফল হবে। এর কারণ %kবিন্যাস উৎপাদনের ' 9'সকাল 9 টা জন্য যেখানে %Hউৎপাদনের '09'সকাল 9 টা জন্য।

echo $(date +%Y%m%d%k%M%S) দেয় 20140626 95138

echo $(date +%Y%m%d%H%M%S) দেয় 20140626095138

ভ্রান্ত তারিখটি এরকম কিছু দিতে পারে:

echo "a" > myapp20140626 95138.log

যেখানে নিম্নলিখিতগুলি যা পছন্দসই হবে:

echo "a" > myapp20140626095138.log

ত্রুটিটি হ'ল এটিতে স্পেস রয়েছে কিনা তা বিবেচনা না করে আপনার ভেরিয়েবলের চারপাশে উদ্ধৃতি থাকা উচিত। শেল ভেরিয়েবলের চারপাশে উদ্ধৃতিগুলি কখন लपेटবেন
ট্রিপলি

5

Path UP OUPUT_RE صلاحts in এ উল্লিখিত পাথটিতে কি কোনও শ্বেত স্পেসের অক্ষর রয়েছে? যদি তা হয় তবে আপনি ... >> "${OUPUT_RESULTS}"(উদ্ধৃতি ব্যবহার করে) ব্যবহার বিবেচনা করতে পারেন ।

(আপনি নিজের ভেরিয়েবলের নাম পরিবর্তন করেও বিবেচনা করতে পারেন ${OUTPUT_RESULTS})


1

ব্যাশ স্ক্রিপ্টে আমার এই ত্রুটিটি ছিল। পূর্ববর্তী লাইনের শেষে সমস্যাটি একটি দুর্ঘটনাজনক ছিল যা একটি ত্রুটি দিচ্ছিল।


1

"অস্পষ্ট পুনঃনির্দেশ" সৃষ্টি করতে পারে এমন অন্য একটি জিনিস আপনি যে \t \n \rভেরিয়েবলের নামেই লিখছেন তা হ'ল

হতে পারে না \n\r? তবে সাবধানতার দিকে ভুল

এটা চেষ্টা কর

echo "a" > ${output_name//[$'\t\n\r']}

\tলাইনের শুরুতে এইচটিএমএল, ট্যাবগুলি বিশ্লেষণ করার সময় আমি এইটির সাথে আঘাত পেয়েছি ।


ত্রুটিটি ভেরিয়েবলের উদ্ধৃতি দিচ্ছে না। শেল ভেরিয়েবলের চারপাশে উদ্ধৃতিগুলি কখন लपेटবেন
ট্রিপলি

1

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

  1. vim a.sh স্ক্রিপ্ট তৈরি করতে
  2. ধারণ করতে স্ক্রিপ্ট সম্পাদনা করুন (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh এটি কার্যকর করার জন্য
  4. a.sh

আপনি যদি এটি করেন তবে আপনি "/ home/ubuntu/a.sh: লাইন 1: $ লজিট: দ্বিপাক্ষিক পুনর্নির্দেশ" পাবেন। এই কারণ

"বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে একটি সাব-শেল তৈরি হবে এবং তালিকার প্রতিটি কমান্ড অ-রফতানযোগ্য ভেরিয়েবল অপসারণ না করে সেই সাবশেলে কার্যকর করা হবে Since তালিকাটি যেহেতু সাব-শেলে কার্যকর করা হয়েছে, পরিবর্তনশীল অ্যাসাইনমেন্টগুলি অবশিষ্ট নেই সাবশেল সম্পূর্ণ হওয়ার পরে কার্যকর in "

বন্ধনী ব্যবহার থেকে শুরু করে গোষ্ঠীতে এবং এক্সপ্রেশনগুলি প্রসারিত করুন

এটি সংশোধন করার জন্য, আপনি প্রথম বন্ধনীর বাইরে ভেরিয়েবলটি নির্ধারণ করতে স্ক্রিপ্টটি দ্বিতীয় ধাপে পরিবর্তন করতে পারেন: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

আপনি যদি শেল কমান্ডে একটি পরিবর্তনশীল নাম ব্যবহার করে থাকেন তবে আপনাকে অবশ্যই এটি +চিহ্ন দিয়ে যুক্ত করতে হবে ।

উদাহরণ স্বরূপ :

যদি আপনার দুটি ফাইল থাকে এবং আপনি ফাইলের নামটি হার্ড কোডে যাচ্ছেন না, পরিবর্তে আপনি পরিবর্তনশীল নামটি ব্যবহার করতে চান
"input.txt" = x
"output.txt" = y

তারপরে ('কোটের মধ্যে শেল কমান্ড' + x> + y)

এটি এইভাবে কাজ করবে বিশেষত যদি আপনি সম্ভবত এটি অ্যাসিস্টেম কমান্ডের সাহায্যে একটি অজগর প্রোগ্রামের মধ্যে ব্যবহার করছেন


0

এটিও হতে পারে।

আপনি কোনও ভেরিয়েবল এবং পুনর্নির্দেশের আউটপুটে ফাইলটি নির্দিষ্ট করেননি, তবে বাশ এই ত্রুটিটি ফেলে দেবে।

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

আউট_ফাইলে ভেরিয়েবলটি সঠিকভাবে সেট আপ করা হয়নি তাই এটিতেও নজর রাখুন। বিটিডব্লিউ এই কোডটি সমস্ত সামগ্রী এবং এর ফাইল নাম কনসোলে মুদ্রণ করছে।


0

একাধিক ফাইলে আউটপুট লিখতে ব্রেস প্রসারণ ব্যবহার করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি।

উদাহরণস্বরূপ: echo "text" > {f1,f2}.txtফলাফল-bash: {f1,f2}.txt: ambiguous redirect

এই ক্ষেত্রে, teeএকাধিক ফাইলের আউটপুট ব্যবহার করুন :

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

1>/dev/nullলেখা হচ্ছে থেকে টেক্সট প্রতিরোধ করবে stdout- এ

আপনি যদি ফাইল (গুলি) ব্যবহার করতে চান তবে to tee -a

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