যদি "বাশ <ফাইল>> কাজ করে, তবে" উত্স <ফাইল> "ত্রুটি কেন ছুঁড়েছে?


26

আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে:

#!/bin/bash
set -x
if :; then
    echo a
fi

যদি আমি চালানোর bash /tmp/file, aপ্রতিধ্বনিত হয়, কিন্তু যদি আমি চালানোর source /tmp/file, আমি পাবেন:

bash: /tmp/test: line 6: syntax error: unexpected end of file

আউটপুট:

knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a


knezi@holly tmp]$od -c /tmp/test
0000000   #   !   /   b   i   n   /   b   a   s   h  \n   s   e   t    
0000020   -   x  \n   i   f       :   ;       t   h   e   n  \n  \t   e
0000040   c   h   o       a  \n   f   i  \n
0000051

কমান্ডের আউটপুট shopt -pএবং set -o: http://pastebin.com/bsqc8aru

এর আউটপুট set: http://pastebin.com/S9KpqZAL

declare -fp কিছুই উত্পাদন করে না।

আমি ভেবেছি sourceএটি একই রকম হয় bashতবে নতুন সেশন শুরু করার পরিবর্তে বর্তমানের কোডটিতে কোড চালায়। কেউ আমাকে এই ত্রুটি ব্যাখ্যা করতে পারেন?

আমি ব্যাশ জিএনইউ ব্যাশ চালনা করছি, সংস্করণ 4.2.53 (1) -রিলেজ (x86_64-redhat-linux-gnu)।


1
না, এটি পুরো কোড। নিউলাইনগুলি 0 এ।
হাঁটু

2
@ রাহুল ইউনিক্স
লাইনফিড

2
$BASH_ENVসেটটি কি ?
রোয়াইমা

2
@ পিএসকোকিক যা সত্যিই অদ্ভুত। bash -c "উত্স / tmp / পরীক্ষা" কাজ করে।
হাঁটু

5
আহ হা! এটি bash -cআপনার প্রশ্নের সাথে কাজ করে যোগ করুন । তারপরে, আপনার ~/.bashrcফাইলের বিষয়বস্তু আমাদের দেখান , সেখানে সম্ভবত এমন কিছু রয়েছে যা জিনিসগুলি স্ক্রু করছে।
টেরডন

উত্তর:


75

যদি আমি উপন্যাস রাখি তবে আমি আপনার আচরণটি পুনরুত্পাদন করতে পারি fi:

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

এটি কার্যকর করার সময় এটি কার্যকর হয় তবে আপনি যখন এটি উত্স করেন তখন ব্যর্থ হয় কারণ অ্যালিয়াসগুলি অ ইন্টারেক্টিভ শেলগুলিতে (শেলের ধরণ যা শেল স্ক্রিপ্টগুলি চালায়) উপলভ্য নয়। ব্যাশ ম্যানুয়ালটিতে যেমন ব্যাখ্যা করা হয়েছে :

শেলটি ইন্টারেক্টিভ না হলে অ্যালিয়াসগুলি প্রসারিত হয় না, যদি না expand_aliasesশেল অপশনটি ব্যবহার করে সেট করা হয় shopt( শপট বিল্টিন দেখুন )।

যাইহোক, যখন আপনি sourceকিছু করেন, এটি আপনার বর্তমান শেলটিতে চালিত হয় যা এটি ইন্টারেক্টিভ হওয়ার কারণে ইতিমধ্যে এলিয়াসগুলি লোড করেছে এবং তাই fiউপনামটি স্বীকৃত এবং স্রোসিংটি ভেঙে দেয়।


16
আপনি পুরোপুরি ঠিক বলেছেন। আমি সেট করে রেখেছি: ওরফে ফাই = 'ফাইন্ড-টাইপ এফ | xargs গ্রেপ-এইচ '।
হাঁটু

7
aliasএখন থেকে মুক্তি পান ! :)
মার্ক স্টুয়ার্ট

9
আমি অবাক হয়েছি যে কেউ এই ধরণের অস্পষ্ট সমস্যাটি সনাক্ত করতে পেরেছেন। ঠিক আছে স্যার।
গাণিতিক

6
@ ম্যাথমেটিক্যালআরকিড আমার সন্দেহ হয়েছিল যে কিছু কিছু আলিয়াস হয়েছে (ইন্টারেক্টিভ শেলের কারণে), setআউটপুট দ্বারা এড়িয়ে গেছে , এবং alias if='foo "'(একটি পেছনের উন্মুক্ত উদ্ধৃতিটি অনুপস্থিত উদ্ধৃতি সম্পর্কে একটি ত্রুটি দিয়েছে, এবং তাই শেষ বিকল্পটি এলিয়াসিং ছিল fi
মুরু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.