স্ক্রিপ্ট আউটপুটটির স্ব-পুনর্নির্দেশের সমান ড্যাশ


9

বাশ-এ আপনি বর্তমানে চলমান স্ক্রিপ্টের সমস্ত ভবিষ্যত স্টডআউট আউটপুট পুনর্নির্দেশ করতে পারেন । এই স্ক্রিপ্ট সহ উদাহরণস্বরূপ,

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

এটি সিসলগে শেষ হবে:

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

তবে এটি বাশ-সুনির্দিষ্ট এবং পুনর্নির্দেশ সহ নগ্ন নির্বাহীরা ড্যাশটিতে কাজ করছে বলে মনে হয় না।

Syntax error: redirection unexpected

আমি কীভাবে এটি ড্যাশ, বা সম্ভবত উভয় শেলের মধ্যে কাজ করতে পারি?


আপনি ঠিক কি প্রয়োজন তা পরিষ্কার করতে পারেন? আপনি >ড্যাশ দিয়ে পুনর্নির্দেশ করতে পারেন । আমি বুঝতে পারি আপনি অন্য কিছু চাইছেন বলে মনে হচ্ছে তবে এটি কী তা আমি যথেষ্ট বলতে পারছি না।
টেরডন

@terdon আমি ব্যাখ্যাটি প্রসারিত করেছি।
অ্যালেক্স বি

উত্তর:


6

আপনি ঠিক করতে পারেন:

{ commands
....
} | logger -t my_awesome_script

যে কোনও শেল দিয়ে আপনি এটি করতে পারেন।

আপনি যদি দেখতে মতো পছন্দ করেন না তবে সম্ভবত স্ক্রিপ্টটি কোনও ফাংশনে আবৃত করুন।

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
      then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
             logger -t my-awesome-script
      fi
#script-body
run "$@" || do stuff

শেষ লাইনটি এমন হওয়া উচিত run ${1+"$@"} || do stuffযাতে যুক্তিগুলি ধরে রাখা যায়।
অ্যাডাম কাটজ

@ অ্যাডামক্যাটজ - ভাল বক্তব্য, নির্বাহী ${1+"$@"}কিছুই করতে পারে না "$@" । যাইহোক এটি অন্যান্য সমস্যা ছিল।
মাইকসার্ভ

"$@"""যখন কোনও যুক্তি নেই তখন পাস হবে যখন যখন কোনও যুক্তি নেই তখন ${1+"$@"}খালি স্ট্রিংটি পাস করবে। এটি অনেক প্রোগ্রামের জন্য দুর্দান্তভাবে গুরুত্বপূর্ণ, কারণ তারা ""একটি খালি যুক্তি হিসাবে পার্স করে যখন একটি (অব্যক্ত) খালি স্ট্রিংটি আর্গুমেন্ট হিসাবে মোটেই ব্যাখ্যা করা যায় না।
অ্যাডাম কাটজ

@ অ্যাডামক্যাটজ - খুব পুরনো বোর্ন শেল হতে পারে (এবং আমি dashএই জাতীয় কোনও সিস্টেমের সন্ধানের আশা করতাম না ) তবে অন্যথায় "$@"অনন্য যে কোনও শূন্য-আর্গসের ক্ষেত্রে পসিক্স শেলের জন্য নাল যুক্তির বিকল্প হয় না।
মাইকজার্ভ

1
@ অ্যাডামক্যাটজ - এটি আসলে পুরানো bsh সালেও একটি বাগ ছিল এবং এর আগে কখনও কাজ করা উচিত হয়নি। এটি শেষ পর্যন্ত ঠিক করা হয়েছিল, তবে সোলারিস 10 এ এটি এখনও প্রয়োজনীয় হওয়া উচিত কিনা তা আমি জানি না whether $ সম্পর্কে করছি ডান * - তার সম্প্রসারণের পরিবর্তনশীল বিষয়বস্তু, এটির স্বতন্ত্রতা onky সংক্রান্ত যদিও এটা সবসময় আমার মতে something.in হবে - এটা স্বল্পতা expabsion একই ঝরঝরে বৈশিষ্ট্য প্রদর্শন "${@+is especially cool $@}" । তবে ${1+”$@"}সর্বোপরি পুরানো কাজের চেয়ে বাস্তবের চেয়ে আলাদা নয়। আপনার যদি কোনও ksh93 থাকে:"${1+quoted" not quoted "quoted again}"
মাইকসার্ভ

5

প্রক্রিয়া প্রতিস্থাপনটি সহজেই নামযুক্ত পাইপগুলির সাথে অনুকরণ করা হয়।

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

প্রকৃতপক্ষে, নামযুক্ত পাইপগুলি এমন একটি প্রক্রিয়া যা (অন্যটি হচ্ছে /dev/fd) যার সাথে প্রক্রিয়া প্রতিস্থাপন প্রয়োগ করা যেতে পারে bash


আমার মতে সবচেয়ে বহুমুখী: আমি বেশ কয়েকটি স্ট্রিমকে নির্বিঘ্নে পুনর্নির্দেশ করতে টি ব্যবহার করতে পারি। কেবল একটি জিনিস: কোনও স্ক্রিপ্টের শেষে তৈরি লগার_পিন্ড মুছতে ভুলবেন না।
lauhub

2

আমি মনে করি না যে এটি সম্ভব dash। যতদূর আমি এর manপৃষ্ঠা থেকে বলতে পারি , এটির প্রক্রিয়া বিকল্পের পক্ষে কোনও সমর্থন নেই।

কর্মক্ষেত্র হিসাবে, আপনি মাইক্রজার কী পরামর্শ দিয়েছেন তা চেষ্টা করতে পারেন, বা আপনি সমস্ত কিছু কোনও ফাইলে পুনর্নির্দেশ করতে পারেন, এবং তারপরে আপনার স্ক্রিপ্টটি শেষ হওয়ার পরে (সম্ভবত এটি কোনও স্ক্রিপ্টে রয়েছে), ফাইলটির বিষয়বস্তু লগারে যুক্ত করুন:

$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script

প্রকৃতপক্ষে, প্রক্রিয়া প্রতিস্থাপন - বা অন্য শেলগুলি কীভাবে প্রক্রিয়াটিকে বিকল্প বলে অভিহিত করে - dashঅন্য শেলগুলির মধ্যে তত সহজ । প্রক্রিয়া প্রতিস্থাপন কেবল একটি যুক্তির সমতুল্য যা /dev/fd/[num]একটি অনামী পাইপের লিঙ্ককে নির্দেশ করে। dashবেশিরভাগ শেল যেমন করে টেম্প ফাইলগুলি তৈরি করার পরিবর্তে বেনামে পাইপগুলি সহ এখানে নথিগুলি করে। সুতরাং cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\nকেবল কার্যকরীভাবেই সমতুল্য নয়, আপনি নিজে এফডিটির নামও পেতে পারেন। তবুও, আপনার বক্তব্যটি অন্যভাবে যাওয়ার বিষয়ে ভালভাবে তৈরি হয়েছে - আপনার একটি নতুন এফডি খুলতে হবে execএবং এটি পড়ার প্রক্রিয়াটির ব্যাকগ্রাউন্ড করতে হবে।
মাইকসার্ভ

2
@ মাইকজার্ভ: কোন অর্থে cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n"সহজ" cat <(get output)?
রুখ 28

@ মিমকিজার: এটি মনে রাখার প্রচুর বিধি জড়িত; সম্ভবত আপনি তাদের এত সহজে ব্যবহার করেছেন যে আপনি খেয়াল করেন না।
রুখ 23

@রুখ - ভাল, নিশ্চিত < >শেল পুনর্নির্দেশগুলি। মূলত আপনি যদি সেগুলির মধ্যে দুটি করেন তবে আপনি নিম্নলিখিত লাইনেও গাদা করতে পারেন। তবে হ্যাঁ, আপনার একটি বক্তব্য আছে - আমি এখানে ডক্স পছন্দ করি। তবুও, যতগুলি জিনিস মনে রাখার প্রয়োজন হতে পারে, যখন তারা সর্বজনীনভাবে কাজ করে বলে মনে করি এটি আরও সহজ। তারপরে আবার অনেক লোকের অন্যান্য শাঁসের জন্য খুব বেশি ব্যবহার হয় না এবং তাই এটি তাদের পক্ষে কোনও পার্থক্য করে না। আমি ঠিক তাদের মধ্যে নেই
মাইক্রোসার্ভ

1
@ মাইকজার্ভ: কেবল হেরডোকসই নয়, /dev/fd/3(সেই সুনির্দিষ্ট আকারে), এবং হোয়াইটস্পেসে কী ঘটে তার বিশদ। । । এবং এই বিষয়টির জন্য, এই সম্পূর্ণ পদ্ধতিটি ড্যাশগুলিতে মোটেই কাজ করে, যখন এটি অন্যান্য শেলগুলিতে কাজ করে না যেখানে সমস্ত উপাদান রয়েছে, এর অর্থ এই যে সামগ্রিক পদ্ধতির বিষয়টি মনে রাখা একটি বিশেষ নিয়ম। (এটি আমাকে কম শব্দভাণ্ডারের সাহায্যে সহজ সরল ইংরেজী তৈরির প্রচেষ্টার কথা মনে করিয়ে দেয়; তারা অবিচল থাকার মত শব্দগুলি ছড়িয়ে দেয় তবে তারা চালিয়ে যাওয়ার মতো কঠিন
প্রতিবাদীদের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.