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




6 Answers

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

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

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

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

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

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

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

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

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




خيار اخر

echo foo >>/dev/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



لا تستخدم 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



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

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

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

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






Related


Tags

bash