লিনাক্সে চুপচাপ কীভাবে `> fail ব্যর্থ হতে পারে?


20

আমি এই আদেশ চালিয়েছি:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

partyapp_dump.jsonফাইলটিতে ডেটা ফেলে দিতে । তবে সমস্ত ডেটা সবে স্ক্রিনে মুদ্রিত হয় এবং একটি খালি partyapp_dump.jsonফাইল তৈরি করা হয়।

কেন এমন হতে পারে? আমি পরীক্ষা করেছি ls > partyapp_dump.jsonএবং এটি পুরোপুরি কাজ করেছে।

উত্তর:


40

সাথে > আপনি কেবল স্ট্যান্ডার্ড আউটপুট পুনর্নির্দেশ করেন। ত্রুটি আউটপুট পুনর্নির্দেশের পরিবর্তে 2> চেষ্টা করুন । উভয় পুনঃনির্দেশ করতে &> ব্যবহার করুন ।


1
এফওয়াইআই, &>কেবল বাশ ৪.০ এবং zsh এর সাম্প্রতিক সংস্করণগুলিতে কাজ করবে। আরও বহনযোগ্য সমাধানের জন্য foo > bar 2&>1,। তথ্যসূত্র: mywiki.wooledge.org/BashFAQ/014
রেইন

6
@ রিন হেনরিচস: এটি 2> & 1, 2 &> 1 নয়
ক্যাম ক্যাম

আমি এটি প্রোগ্রামিং থেকে নিউমোনিক (?) দিয়ে মনে করেছি: '2' থেকে ('>') '1' এর অবস্থান ('&')
হোমস্টাস্ট

1
@ হোমোস্ট: আপনার অর্থ স্মৃতিচারণ? :) নিউমোনিক মানে ফুসফুস ...
কার্পেট

22

আপনার পাইথন অ্যাপ্লিকেশন অবশ্যই এটি STDERR আউটপুট চ্যানেলে সাধারণ STDOUT এর পরিবর্তে লিখবে। শেলটি ব্যবহার করে >কেবল আউটপুট চ্যানেলে লিখিত ডেটা ক্যাচ করে এবং পুনর্নির্দেশ করা হয় তবে বাস্তবে এমন আরও কয়েকটি চ্যানেল প্রিন্ট করা যায় যা সবচেয়ে সাধারণ দ্বিতীয়টি সাধারণত ত্রুটির জন্য ব্যবহৃত হয়।

আপনি এসটিডিআরআর (২ য় চ্যানেল) এর সাথে আটকে দেওয়ার চেষ্টা করতে পারেন:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

2>&1কনস্ট্রাক্ট স্বাভাবিক আউটপুট চ্যানেলে ত্রুটির জন্য আউটপুট প্রবাহ সংযোগ করে। কোনও প্রোগ্রামের আউটপুট উত্পন্ন করা অস্বাভাবিক, যা আপনি ত্রুটি চ্যানেলে ক্যাপচার করতে চান; সাধারণত এটি অ্যাপ্লিকেশন ডেটা নয় ডিবাগ তথ্যের জন্য সংরক্ষিত থাকবে। এই স্ক্রিপ্টটি কোনও সতর্কতার সাথে ব্যবহার করুন যেহেতু এটি একটি মান -হীন আচরণ করে।

আপনি আউটপুট এবং ত্রুটি চ্যানেলগুলি এই জাতীয় বিভিন্ন ফাইলের মধ্যে ফেলে দিতে পারেন:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt

5

ইতিমধ্যে প্রস্তাবিত stderr বনাম stdout আউটপুট ব্যাখ্যা ছাড়াও, আপনার অ্যাপ্লিকেশনটি কেবল এই উভয় স্ট্রিমটিকে উপেক্ষা করতে পারে এবং এর আউটপুটটির জন্য স্পষ্টভাবে "/ dev / tty" খুলতে পারে।


1

যদি noclobberবাশ বিকল্পটি সেট করা থাকে তবে গন্তব্য ফাইলটি ইতিমধ্যে বিদ্যমান থাকলে পুনঃনির্দেশ ব্যর্থ হবে (নিঃশব্দে না হলেও)।

আরও ভাল বহনযোগ্যতার জন্য, cmd >| fileবিদ্যমান যে কোনও ফাইলকে ওভাররাইট করার জন্য জোর করে ব্যবহার করুন।


0

আপনি যদি হারিয়ে যান তবে সর্বদা স্ট্রেস দিয়ে এটি চালানোর চেষ্টা করতে পারেন যে কী প্রক্রিয়াগুলি করছে:

strace -f command

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