অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি `('


15

আমি যখন সেন্টোএসের জন্য এসএসএইচ টার্মিনালে কোডের নীচে ব্যবহার করি তবে এটি ভাল কাজ করে:

paste <(printf "%s\n" "TOP")

তবে যদি আমি একই লাইন কোডটি শেল স্ক্রিপ্টে (টেস্ট.শ) রাখি এবং টার্মিনাল থেকে শেল স্ক্রিপ্টটি চালিত করি তবে এটি ত্রুটিটিকে এটি হিসাবে ফেলে দেয়

./test.sh: line 30: syntax error near unexpected token ('   
./test.sh: line 30:     paste <(printf "%s\n" "TOP")

আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?


ঠিক কীভাবে আপনি এটি চালাচ্ছেন? কি '#!' লাইন (যদি থাকে) আপনার স্ক্রিপ্ট শুরু করে? দেখে মনে হচ্ছে আপনি এমন শেল ইন্টারপ্রেটারকে ডাকছেন যা সেই সিনট্যাক্সটিকে সমর্থন করে না (যেমন dashপরিবর্তে bash))
স্টিল্ড্রাইভার

আমি #!/bin/shশীর্ষে আছে। আমি মৃত্যুদন্ড কার্যকর করেছি bash test.shকিন্তু এটিও কার্যকর হয়নি।
NecNecco

bashপসিক্স মোডে সেই বাক্য গঠনটিকে সমর্থন করে না (যখন সাথে ডাকা --posixবা হিসাবে ডাকা হয় /bin/sh)। ব্যবহার #!/bin/bash
জর্ডানম

@ নেঙ্কনকো: আপনি POSIXLY_CORRECTযখন শুরু করবেন তখন কি আপনার পরিবর্তনশীল সেট থাকে bash?
cuonglm

@ জোর্ডানম শীর্ষে স্যুইচ করা #!/bin/bashসমস্যার সমাধান করেছে।
NecNecco

উত্তর:


23

প্রক্রিয়া প্রতিকল্পন POSIX দ্বারা নির্দিষ্ট করা নেই, তাই না সব POSIX শেল এটা সমর্থন, শুধুমাত্র কিছু শাঁস পছন্দ bash, zsh,ksh88 , ksh93সমর্থন।

ইন Centosসিস্টেম, /bin/shকরতে সিমবলিক লিঙ্ক হয় /bin/bash। যখন bashনামের সাথে ডাকা হয় sh, তখন bashপিক্সিক্স মোডে প্রবেশ করা হয় ( ব্যাশ স্টার্টআপ ফাইলগুলি - নামের সাথে জড়িত )। পোস্টিক্স মোডে, process substitutionসমর্থিত নয়, সিনট্যাক্স ত্রুটির কারণ ঘটায়।

আপনি bashসরাসরি কল করলে স্ক্রিপ্টের কাজ করা উচিত bash test.sh। যদি তা না হয় তবে bashপোস্টিক্স মোডে প্রবেশ করেছে। আপনি যুক্তি bashদিয়ে শুরু করলে --posixবা ভেরিয়েবলটি POSIXLY_CORRECTসেট করার সময় সেট করা থাকলে এটি ঘটতে পারে bash:

$ bash --posix test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")'

$ POSIXLY_CORRECT=1 bash test.sh 
test.sh: line 54: syntax error near unexpected token `('
test.sh: line 54: `paste <(printf "%s\n" "TOP")

বা বিকল্প bashদিয়ে নির্মিত হয় --enable-strict-posix-default

এখানে, আপনার প্রক্রিয়া বিকল্পের দরকার নেই, আপনি স্ট্যান্ডার্ড শেল পাইপ ব্যবহার করতে পারেন:

printf "%s\n" "TOP" | paste -

-pasteস্টিডিনের ডেটা পড়তে বলার মানক উপায় । কিছু pasteবাস্তবায়ন সহ, আপনি এটি বাদ দিতে পারেন যদিও এটি মানসম্মত নয়।

একাধিক কমান্ডের আউটপুট আটকানোর সময় এটি কার্যকর হবে যেখানে:

paste <(cmd1) <(cmd2)

যে সিস্টেমগুলিতে সমর্থন করে /dev/fd/n, সেগুলি এর সাথে করা যেতে পারে sh:

{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0

(এটি <(...)অভ্যন্তরীণভাবে কী করে)।


2

এখানে আরও একটি কাজ আছে। কমান্ডটি চালনার পরিবর্তে ব্যাশ চালান এবং কমান্ডটি -c ব্যবহার করে পাস করুন

bash -c 'paste <(printf "%s\n" "TOP")'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.