বাশ: সিনট্যাক্স ত্রুটি: পুনর্নির্দেশ অপ্রত্যাশিত


137

আমি এটি একটি স্ক্রিপ্টে করি:

read direc <<< $(basename `pwd`)

এবং আমি পেয়েছি:

Syntax error: redirection unexpected

একটি উবুন্টু মেশিনে

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

আমি অন্য ত্রুটিযুক্ত মেশিনে এই ত্রুটিটি পাই না যদিও:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

ত্রুটি কেন?


অবগতির জন্য, কমান্ড হিসাবে ভাল (/ বিন / ব্যাশ --version গনুহ ব্যাশ, সংস্করণ 3.2.49 (23) -release (i686-পিসি cygwin) কপিরাইট (ক) 2007 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনকর্পোরেটেড) cygwin উপর কাজ করে
hlovdal

উত্তর:


242

আপনার স্ক্রিপ্টটি রেফারেন্স দেয় /bin/bashবা /bin/shএর হ্যাশ ব্যাং লাইনে? উবুন্টুতে ডিফল্ট সিস্টেম শেলটি ড্যাশ , বাশ নয় , সুতরাং যদি আপনার কাছে থাকে #!/bin/shতবে আপনার স্ক্রিপ্টটি আপনার প্রত্যাশার চেয়ে আলাদা শেল ব্যবহার করবে। ড্যাশের <<<পুনঃনির্দেশ অপারেটর নেই।


14

ডক-শ্রমিক:

আমি আমার ডকফাইফিলের মতো এই সমস্যাটি পাচ্ছিলাম:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

তবে, এই সমস্যা অনুসারে , এটি সমাধান করা হয়েছিল:

Exec ফর্ম এটা শেল স্ট্রিং munging এড়াতে সম্ভব, এবং সহজ করে তোলে RUN একটি বেস চিত্র ধারণ করে না ব্যবহার কমান্ড /bin/sh

বিঃদ্রঃ

ভিন্ন শেলটি /bin/shব্যবহার করতে , কাঙ্ক্ষিত শেলটিতে পাস করে এক্সিকিউর ফর্মটি ব্যবহার করুন । উদাহরণ স্বরূপ,

RUN ["/bin/bash", "-c", "echo hello"]

সমাধান:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

প্রতিটি প্যারামিটারের চারপাশে উদ্ধৃতিগুলি লক্ষ্য করুন ।


14

আপনি যদি আপনার স্ক্রিপ্টটি চালাতে নিম্নলিখিত ব্যবহার করে থাকেন:

sudo sh ./script.sh

তারপরে আপনি পরিবর্তে নিম্নলিখিতটি ব্যবহার করতে চান:

sudo bash ./script.sh

এর কারণ হ'ল বাশ উবুন্টুর জন্য ডিফল্ট শেল নয়। সুতরাং, আপনি যদি "sh" ব্যবহার করেন তবে এটি কেবলমাত্র ডিফল্ট শেল ব্যবহার করবে; যা আসলে ড্যাশ। #!/bin/bashআপনার স্ক্রিপ্টের শীর্ষে থাকলে তা ঘটবে না happen ফলস্বরূপ, bashউপরে বর্ণিত হিসাবে আপনাকে স্পষ্টভাবে ব্যবহার করতে হবে এবং আপনার স্ক্রিপ্টটি প্রত্যাশিতভাবে চালানো উচিত।

ড্যাশ বাশের মতো পুনঃনির্দেশকে সমর্থন করে না।


6

আপনি এই কমান্ডের আউটপুট পেতে এবং এটি একটি ভেরিয়েবলের মধ্যে রাখতে পারেন। তারপরে ব্যবহার করুন heredoc। উদাহরণ স্বরূপ:

nc -l -p 80 <<< "tested like a charm";

যেমন লেখা যেতে পারে:

nc -l -p 80 <<EOF
tested like a charm
EOF

এবং এটির মতো (এটি আপনি চান):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

busyboxনীচের dockerপাত্রে ব্যবহারিক উদাহরণ :

kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt!       => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.


/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!

... বা echo 'text' | ncযা আরও ছোট।
ফিল্ড 294

2

এটি সহজ উপায়ে করুন,

direc=$(basename `pwd`)

বা শেল ব্যবহার করুন

$ direc=${PWD##*/}

1

ত্রুটির আরেকটি কারণ হতে পারে আপনি যদি ক্রোন জব চালাচ্ছেন যা কোনও সাবস্ট্রেশন ওয়ার্কিং কপি আপডেট করে এবং তারপরে কোনও সংস্করণযুক্ত স্ক্রিপ্ট চালানোর চেষ্টা করে যা আপডেটের পরে বিরোধিত অবস্থায় ছিল ...


1

আমার মেশিনে, আমি সরাসরি স্ক্রিপ্ট চালালে ডিফল্ট হয় bash

আমি এটি দিয়ে চালানো হলে sudo, ডিফল্ট হয় sh

এজন্য আমি যখন ব্যবহার করতাম তখন আমি এই সমস্যায় পড়ছিলাম sudo


0

আমার ক্ষেত্রে ত্রুটি কারণ আমি ">>" দুবার রেখেছি

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

আমি ঠিক হিসাবে এটি সংশোধন

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH

0

স্ক্রিপ্টটি চালানোর আগে, আপনাকে দোভাষীর জন্য শেল স্ক্রিপ্টের প্রথম লাইনটি পরীক্ষা করা উচিত।

উদাহরণস্বরূপ: স্ক্রিপ্টগুলি যদি / বিন / বাশ দিয়ে শুরু হয়, তবে নীচের কমান্ড "বাশ স্ক্রিপ্ট_নাম.শ" ব্যবহার করে স্ক্রিপ্টটি চালান

যদি স্ক্রিপ্টটি / বিন / শ দিয়ে শুরু হয় তবে নীচের কমান্ড "sh স্ক্রিপ্ট_নাম.শ" ব্যবহার করে স্ক্রিপ্টটি চালান

./sample.sh - এটি স্ক্রিপ্টের প্রথম লাইন থেকে দোভাষীটি সনাক্ত করবে এবং চালাবে।

ডিফল্ট হিসাবে বিভিন্ন লিনাক্সের বিভিন্ন শেল রয়েছে Linux


1
যদিও আমরা আপনার উত্তরের জন্য আপনাকে ধন্যবাদ জানাই, অন্য উত্তরগুলির উপরে যদি এটি অতিরিক্ত মান সরবরাহ করে তবে এটি আরও ভাল। এই ক্ষেত্রে, আপনার উত্তর অতিরিক্ত মান সরবরাহ করে না, যেহেতু অন্য ব্যবহারকারী ইতিমধ্যে সমাধানটি পোস্ট করেছেন। যদি পূর্বের উত্তরটি আপনার পক্ষে সহায়ক হয়ে থাকে তবে আপনার একই তথ্য বারবার না দিয়ে ভোট দেওয়া উচিত up
টবি স্পিড

আপনি কি মনে করেন না যে আমি উদাহরণটির সাথে সমাধানটি এখানে ব্যাখ্যা করেছি?
সিজনেশ

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