আপনার স্ক্রিপ্টে / থেকে STDIN, STDOUT বা STDERR পাইপ করা হচ্ছে কিনা তা নির্ধারণ করার কোনও বুদ্ধিমান উপায় নেই , মূলত প্রোগ্রামগুলির কারণে ssh
।
যে জিনিসগুলি "সাধারণত" কাজ করে
উদাহরণস্বরূপ, নিম্নলিখিত ব্যাশ সমাধানটি একটি ইন্টারেক্টিভ শেলটিতে সঠিকভাবে কাজ করে:
[[ -t 1 ]] && \
echo 'STDOUT is attached to TTY'
[[ -p /dev/stdout ]] && \
echo 'STDOUT is attached to a pipe'
[[ ! -t 1 && ! -p /dev/stdout ]] && \
echo 'STDOUT is attached to a redirection'
তবে তারা সবসময় কাজ করে না
যাইহোক, এই কমান্ডটি একটি নন-টিটিওয়াই কমান্ড হিসাবে চালিত করার সময় ssh
, এসটিডি স্ট্রিমগুলি সর্বদা দেখে মনে হয় যে সেগুলি পাইপ করা হচ্ছে। এটি প্রদর্শনের জন্য, STDIN ব্যবহার করা সহজ কারণ এটি সহজ:
# CORRECT: Forced-tty mode correctly reports '1', which represents
# no pipe.
ssh -t localhost '[[ -p /dev/stdin ]]; echo ${?}'
# CORRECT: Issuing a piped command in forced-tty mode correctly
# reports '0', which represents a pipe.
ssh -t localhost 'echo hi | [[ -p /dev/stdin ]]; echo ${?}'
# INCORRECT: Non-tty mode reports '0', which represents a pipe,
# even though one isn't specified here.
ssh -T localhost '[[ -p /dev/stdin ]]; echo ${?}'
কেন এটি গুরুত্বপূর্ণ
এটি একটি দুর্দান্ত ব্যাপার, কারণ এর দ্বারা বোঝা যায় যে কোনও নন-টিটি-টি ssh
কমান্ড পাইপ হচ্ছে কি না তা বলার জন্য বাশ স্ক্রিপ্টের কোনও উপায় নেই । নোট করুন যে এই দুর্ভাগ্যজনক আচরণটি চালু হয়েছিল যখন সাম্প্রতিক সংস্করণগুলি টি ssh
-টিওয়াই স্টাডিওর জন্য পাইপ ব্যবহার শুরু করে। পূর্ববর্তী সংস্করণগুলি সকেট ব্যবহার করেছে, যা ব্যবহারের মাধ্যমে বাশের মধ্যে পৃথক হতে পারে [[ -S ]]
।
যখন এটি গুরুত্বপূর্ণ
এই সীমাবদ্ধতা সাধারণত সমস্যার সৃষ্টি করে যখন আপনি কোনও বাশ স্ক্রিপ্ট লিখতে চান যা একটি সংকলিত ইউটিলিটির মতো আচরণ করে cat
। উদাহরণস্বরূপ, cat
একই সাথে বিভিন্ন ইনপুট উত্সগুলি পরিচালনা করতে নিম্নলিখিত নমনীয় আচরণের অনুমতি দেয় এবং এটি টি-পিওয়াই বা জোর করে-টিটিওয়াই ssh
ব্যবহার করা হচ্ছে না তা নির্বিশেষে পাইপযুক্ত ইনপুট গ্রহণ করছে কিনা তা নির্ধারণ করতে যথেষ্ট স্মার্ট :
ssh -t localhost 'echo piped | cat - <( echo substituted )'
ssh -T localhost 'echo piped | cat - <( echo substituted )'
আপনি কেবল তেমন কিছু করতে পারেন যদি আপনি নির্ভরযোগ্যভাবে নির্ধারণ করতে পারেন পাইপগুলি জড়িত কিনা। অন্যথায়, কোনও পাইপ বা পুনর্নির্দেশ থেকে কোনও ইনপুট না পাওয়া অবস্থায় STDIN পড়ার একটি কমান্ড কার্যকর করলে স্ক্রিপ্টটি স্তব্ধ হয়ে যায় এবং STDIN ইনপুটটির জন্য অপেক্ষা করতে থাকবে।
অন্যান্য জিনিস যা কাজ করে না
এই সমস্যাটি সমাধান করার চেষ্টা করার সময়, আমি কয়েকটি কৌশল অবলম্বন করেছি যা সমস্যার সমাধান করতে ব্যর্থ হয়েছে যার মধ্যে রয়েছে:
- এসএসএইচ এনভায়রনমেন্ট ভেরিয়েবল পরীক্ষা করা
stat
/ dev / stdin ফাইল বর্ণনাকারী ব্যবহার করে
- মাধ্যমে ইন্টারেক্টিভ মোড পরীক্ষা করা
[[ "${-}" =~ 'i' ]]
tty
এবং মাধ্যমে tty স্থিতি পরীক্ষা করাtty -s
ssh
মাধ্যমে স্থিতি পরীক্ষা করা[[ "$(ps -o comm= -p $PPID)" =~ 'sshd' ]]
মনে রাখবেন যে আপনি যদি /proc
ভার্চুয়াল ফাইল সিস্টেমটিকে সমর্থন করে এমন কোনও ওএস ব্যবহার করছেন, তবে কোনও পাইপ ব্যবহৃত হচ্ছে কিনা তা নির্ধারণের জন্য আপনার স্টাডিওয়ের প্রতীকী লিঙ্কগুলি অনুসরণ করার ভাগ্য থাকতে পারে। তবে, /proc
কোনও ক্রস প্ল্যাটফর্ম নয়, পসিক্স-সামঞ্জস্যপূর্ণ সমাধান।
আমি এই সমস্যাটি সমাধানে অত্যন্ত আকর্ষণীয়, সুতরাং দয়া করে আপনি যদি অন্য কোনও প্রযুক্তি সম্পর্কে কাজ করে যা সম্ভবত পিনাক্স-ভিত্তিক সমাধান যা লিনাক্স এবং বিএসডি উভয় ক্ষেত্রেই কাজ করে সে সম্পর্কে মনে করেন তবে আমাকে জানান know