z3x - shell معنى




في برنامج نصي shell: أوامر shell echo كما يتم تنفيذها (10)

أنا استخدم وظيفة للصدى ثم قم بتشغيل الأمر

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

exe echo hello world

أي مخرجات

$ echo hello world
hello world

تصحيح:

للأوامر أكثر تعقيدًا ، يمكنك استخدام eval:

#!/bin/bash
#function to display commands
exe() { echo "\$ ${@/eval/}" ; "[email protected]" ; }

exe eval "echo 'Hello World' | cut -d ' ' -f1"

أي مخرجات

$  echo 'Hello World' | cut -d ' ' -f1
Hello

في برنامج نصي shell كيف أكرر كل أوامر shell استدعاء وتوسيع أي أسماء المتغيرات؟ على سبيل المثال ، بالنظر إلى السطر التالي:

ls $DIRNAME

أرغب في تشغيل البرنامج النصي للأمر وعرض ما يلي

ls /full/path/to/some/dir

الغرض هو حفظ سجل بكافة أوامر shell تسمى ووسائطها. ربما هناك طريقة أفضل لتوليد مثل هذا السجل؟


إجابة شوكك عن ترديد الخطوط المختارة لديها بعض السلبيات: في نهاية المطاف مع المجموعة التالية set +x أمر مردد أيضا ، وتفقد القدرة على اختبار رمز الخروج مع $? نظرًا لأنه يتم الكتابة فوقه بواسطة set +x .

خيار آخر هو تشغيل الأمر في subshell:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

مما يمنحك مخرجات مثل:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

هذا لا يتحمل الزائد من إنشاء subshell جديد للأمر ، وإن كان.


بالنسبة إلى csh و tcsh ، يمكنك set verbose أو set echo (أو يمكنك حتى تعيين كلاهما ، ولكن قد ينتج عنه بعض الازدواجية معظم الوقت).

يطبع الخيار verbose حد كبير تعبير shell الدقيق الذي تكتبه.

خيار echo هو أكثر دلالة على ما سيتم تنفيذه من خلال وضع البيض.

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo

Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.


خيار آخر هو وضع "x" في الجزء العلوي من البرنامج النصي الخاص بك بدلاً من سطر الأوامر:

$ cat ./server
#!/bin/bash -x
ssh [email protected]

$ ./server
+ ssh [email protected]
[email protected]'s password: ^C
$

(ممثل غير كاف للتعليق على الإجابة المختارة.)


لصدى zsh

 setopt VERBOSE

وللتصحيح

 setopt XTRACE

للسماح لأوامر المركب أن تكون صدى ، وأنا استخدم الدالة eval plus Soth في صدى ثم قم بتشغيل الأمر. هذا مفيد للأوامر piped التي فقط وإلا ستظهر لا شيء أو فقط الجزء الأولي من الأمر piped.

دون eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe ls -F | grep *.txt

المخرجات:

$
file.txt

مع eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe eval 'ls -F | grep *.txt'

أي مخرجات

$ exe eval 'ls -F | grep *.txt'
file.txt

يمكنك تنفيذ برنامج نصي bash في وضع التصحيح باستخدام الخيار -x .
هذا سوف يردد كل الأوامر.

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt


يمكنك أيضًا حفظ الخيار -x في النص البرمجي . فقط حدد الخيار -x في shebang.

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt




يمكنك أيضًا تبديل هذا لتحديد خطوط في النص البرمجي عن طريق لفها في set -x set +x سبيل المثال

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

set -x تعطيك ما تريد.

هنا مثال على برنامج نصي شل ليوضح:

#!/bin/bash
set -x #echo on

ls $PWD

هذا يوسع جميع المتغيرات ويطبع الأوامر الكاملة قبل إخراج الأمر.

انتاج:

+ ls /home/user/
file1.txt file2.txt

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

الناتج هو على النحو التالي:







shell