[bash] صدى أن المخرجات إلى stderr



Answers

يمكنك تحديد وظيفة:

echoerr() { echo "$@" 1>&2; }
echoerr hello world

سيكون هذا أسرع من البرنامج النصي وليس له تبعيات.

يستخدم اقتراح Bash الخاص بشركة Camilo Martin "سلسلة هنا" وسيقوم بطباعة أي شيء تمر عليه ، بما في ذلك الحجج (-n) التي يبتلعها الصدى عادة:

echoerr() { cat <<< "$@" 1>&2; }

حل جلين جاكمان يتجنب أيضا مشكلة بلع الوسيطة:

echoerr() { printf "%s\n" "$*" >&2; }
Question

هل هناك أداة Bash قياسية تعمل مثل الارتداد ، ولكن يتم إخراجها إلى stderr بدلاً من stdout؟

أعلم أنه يمكنني القيام echo foo 1>&2 ولكنه قبيح نوعًا ما ، وأظن أنه عرضة للخطأ (على سبيل المثال أكثر احتمالية لتحرير الخطأ عندما تتغير الأشياء).




لقد تم الرد على هذا بالفعل وبالكثير من الأصوات. فقط للتسجيل:

echo "my errz" > /proc/self/fd/2

سوف تنتج بفعالية إلى stderr . Explanation: /proc/self عبارة عن وصلة للعملية الحالية و /proc/self/fd تحمل عملية واصفات الملف المفتوحة. ثم ، 0 ، 1 ، و 2 تعني stdin و stdout و stderr على التوالي.

لقد وجدت أنه أكثر قابلية للقراءة. قد يعمل هذا أيضًا في معظم عمليات توزيع linux:

echo "my errz" > /dev/stderr

مما يجعلها أكثر قابلية للقراءة.




اصنع سيناريو

#!/bin/sh
echo $* 1>&2

من شأنه أن يكون أداتك.

أو قم بعمل وظيفة إذا كنت لا تريد أن يكون لديك برنامج نصي في ملف منفصل.




لا تستخدم cat كما ذكر بعضها هنا. cat هو برنامج في حين echo و printf هي باش (قذيفة) بنيت. إن إطلاق برنامج أو برنامج نصي آخر (كما هو مذكور أعلاه) يعني إنشاء عملية جديدة بكل تكاليفها. باستخدام مدمج ، وظائف الكتابة رخيصة جدا ، لأنه لا توجد حاجة لإنشاء (تنفيذ) عملية (البيئة).

يسأل opner "هل هناك أي أداة قياسية لإخراج ( الأنابيب ) إلى stderr" ، الجواب schort هو: NO ... لماذا؟ ... أنابيب reddercting هي مفهوم أساسي في أنظمة مثل unix (Linux ...) و bash (sh) يتراكم على هذه المفاهيم.

أتفق مع الافتتاحية التي تقول بأن إعادة التوجيه مع مثل هذه الرموز: &2>1 ليست ممتعة جدًا للمبرمجين الحديثين ، ولكن هذا هو bash. لم يكن المقصود باش لكتابة برامج ضخمة وقوية ، ويهدف إلى مساعدة المدراء للوصول إلى هناك عمل مع أقل keypresses ؛-)

وعلى الأقل ، يمكنك وضع إعادة التوجيه في أي مكان في السطر:

$ echo This message >&2 goes to stderr 
This message goes to stderr



هذه هي وظيفة STDERR بسيطة ، والتي تعيد توجيه مدخلات الأنابيب إلى STDERR.

#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {

cat - 1>&2

}

# remove the directory /bubu
if rm /bubu 2>/dev/null; then
    echo "Bubu is gone."
else
    echo "Has anyone seen Bubu?" | STDERR
fi


# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err



خيار اخر

echo foo >>/dev/stderr



Related



Tags

bash bash