Bash ස්ක්‍රිප්ට් නිදොස් කරන්නේ කෙසේද?


157

දෝෂ සහ අනපේක්ෂිත හැසිරීම් ගැන මට සමහර ස්ක්‍රිප්ට් සමඟ ගැටලු තිබේ. ගැටලුවලට හේතු සොයා බැලීමට මා කැමතිය. වැඩි විස්තර ලබා ගැනීම සඳහා, මට යම් ආකාරයක "නිදොස් කිරීමේ මාදිලියක්" බැෂ් සඳහා හැරවිය හැකි ක්‍රමයක් තිබේද?

Answers:


154

දෝශ නිරාකරණ ප්‍රතිදානය බැලීමට bash -x ./script.shඔබේ ස්ක්‍රිප්ට් set -xඑක සමඟ ඔබේ බාෂ් ස්ක්‍රිප්ට් එක ආරම්භ කරන්න .


bash4.1 හෝ ඊට පසු අතිරේක :

ඔබට දෝශ නිරාකරණ ප්‍රතිදානය වෙනම ගොනුවකට ලිවීමට අවශ්‍ය නම්, මෙය ඔබගේ ස්ක්‍රිප්ටයට එක් කරන්න:

exec 5> debug_output.txt
BASH_XTRACEFD="5"

බලන්න: https://stackoverflow.com/a/25593226/3776858


ඔබට පේළි අංක බැලීමට අවශ්‍ය නම් මෙය එක් කරන්න:

PS4='$LINENO: '


ඔබට loggerවිධානයට ප්‍රවේශය ඇත්නම්, ඔබට මෙය භාවිතා කළ හැක්කේ කාලරාමුව, ස්ක්‍රිප්ට් නම සහ පේළි අංකය සමඟ ඔබේ සයිස්ලොග් හරහා දෝශ නිරාකරණ ප්‍රතිදානය ලිවීමට ය:

#!/bin/bash

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

# Place your code here

ඔබ විකල්පය භාවිතා කළ හැකි -pවන loggerඑහි ම logfile දේශීය syslog හරහා කපා ප්රතිදානය සඳහා තනි තනි පහසුකම් හා මට්ටමේ ඇති කිරීමට අණ.


8
-v ට උදව් කළ හැකිය (එක් එක් පේළිය ක්‍රියාත්මක වන විට ඒවා මුද්‍රණය කරයි. -x සමඟ ඒකාබද්ධ කළ හැකිය). මෙයද බලන්න: bashdb.sourceforge.net
ඔලිවියර්

4
තවත් අපූරු සම්පතක් නම්: shellcheck.net
ඔලිවියර්

"ක්‍රියාත්මක 5>" කරන්නේ කුමක්ද?
aggsol

4
@aggsol: ඔබ භාවිතා කරන්නේ නම් BASH_XTRACEFD="5"bash විට ජනනය කරන ලද හෝඩුවාවක් ප්රතිදානය මෙසේ ලියයි set -xසකසල ගොනුව descriptor 5. exec 5> >(logger -t $0)ගොනුව descriptor 5 සිට යළි-යොමුකරයි ප්රතිදානය loggerවිධාන.
සයිරස්

1
PS4 හි ඔබට පේළි අංකය සහ ෂෙල් ස්ක්‍රිප්ට් මාර්ගය හෝ නම ලබා ගත හැකිද?
niken

64

භාවිතා කිරීම set -x

මම සෑම විටම භාවිතා set -xහා set +x. වාචිකතාව ඉහළට / පහළට හැරවීමට ඔබට ඔවුන් සමඟ සිදුවන්නේ කුමක්දැයි බැලීමට අවශ්‍ය ප්‍රදේශ ඔතා තැබිය හැකිය.

#!/bin/bash

set -x
..code to debug...
set +x

log4bash

එසේම ඔබ සංවර්ධන කටයුතු කර ඇති අතර ලොග් 4 ජේ, ලොග් 4 පර්ල් යනාදී නම් වලින් ලොගර් විලාසය හුරුපුරුදු නම්, ඔබට ලොග් 4 බෑෂ් භාවිතා කිරීමට අවශ්‍ය විය හැකිය .

උපුටා ගැනීම

අපි එයට මුහුණ දෙමු - සරල පරණ දෝංකාරය එය කපා දමන්නේ නැත. log4bash යනු Bash ස්ක්‍රිප්ට් සඳහා වඩා හොඳ ල ging ු-සටහන් ලබා ගැනීමේ උත්සාහයකි (එනම්, Bash හි ලොග් වීම අඩු කරන්න).

එතැන් සිට ඔබේ බෑෂ් ස්ක්‍රිප්ට් වල මෙවැනි දේ කළ හැකිය:

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

මෙම වර්ගයේ ප්‍රතිදානයේ ප්‍රති ult ල:

    ss1

log4sh

ඔබට වඩා අතේ ගෙන යා හැකි යමක් අවශ්‍ය නම් පැරණි දේද log4shතිබේ. සමාන වැඩ log4bash, මෙහි ඇත:


උබුන්ටු වල, alias say="spd-say"මගේ .bashrc හි ඇත, එය sayවෙනත් ඩිස්ට්‍රෝස් හෝ ඕඑස් එක්ස් වෙතින් විධානය අනුකරණය කරයි .
ඩෝර්ක්නොබ්

2
trap - trap read debug සමඟ භාවිතා කරන්නේ නම් set -vx හොඳ සංයෝජනයක් වනු ඇත. මෙය ඔබට රේඛාව ඔස්සේ ගමන් කර
මැග්නස් මෙල්වින්

35

බොහෝ ඩිස්ට්‍රෝස් වල ස්ථාපනය කළ හැකි පැකේජයක් වන bashdb , bash debugger ඇත. එය bash හි සාදන ලද දීර් deb නිදොස් කිරීමේ මාදිලිය ( shopt -s extdebug) භාවිතා කරයි. එය gdb වගේ. යම් රසයක් ලබා දීම සඳහා නියැදි සැසියක් මෙන්න:

$ ls
1st.JPG  2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
  newf=${f/JPG/jpg}
  mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1:      for f in *.JPG
bashdb<0> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4:        mv $f $newf

Gdb හි මෙන්, ප්‍රකාශය ක්‍රියාත්මක කිරීමට පෙර එය පෙන්වනු ලැබේ. එම නිසා ප්‍රකාශය සිදු කිරීමට පෙර එය කරන්නේ කුමක් දැයි බැලීමට අපට විචල්‍යයන් පරීක්ෂා කළ හැකිය.

bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1:      for f in *.JPG
bashdb<4> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4:        mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG

අපට අවශ්‍ය වන්නේ එය නොවේ! පරාමිති ප්‍රසාරණය දෙස නැවත බලමු.

bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg

හරි, ඒක වැඩ කරනවා. එහෙනම් අපි කට්ටලයක් newfනිවැරදි අගය කිරීමට.

bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg

හොඳයි වගේ. පිටපත දිගටම කරගෙන යන්න.

bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg  2ndJPG.jpg

19

බාෂ් වැනි බොහෝ බෝර්න් මත පදනම් වූ ෂෙල් වෙඩි වල ස්ක්‍රිප්ට් නිදොස්කරණය කිරීමේ සම්මත ක්‍රමය set -xවන්නේ ඔබේ ස්ක්‍රිප්ටයේ ඉහළින්ම ලිවීමයි . මෙය සිදු කරනු ලබන / ක්‍රියාත්මක කරන දේ සහ තර්ක ඇගයීමට ලක් කරන්නේ කෙසේද යන්න පිළිබඳව වඩාත් වාචිකව කතා කරයි.

-x  Print commands and their arguments as they are executed.

මෙය පරිවර්තකයාට හෝ ඇතුළත ස්ක්‍රිප්ට සඳහා ප්‍රයෝජනවත් වේ. උදාහරණයක් වශයෙන්:

$ find "$fileloc" -type f -prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -prune $filename -print
+ find /var/adm/logs/morelogs -type f -prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory

සමහර තනි උපුටා දැක්වීම් නිසා සොයා ගැනීම අසමත් වන්නේ මන්දැයි ඉහත අපට දැක ගත හැකිය.

අංගය අක්‍රිය කිරීමට, ටයිප් කරන්න set +x.


13

සූර්යග්‍රහණය භාවිතා කිරීම

පහත දැක්වෙන "_DEBUG.sh" ස්ක්‍රිප්ට් සමඟ ඔබට සූර්යග්‍රහණය සහ ෂෙල්ඩ් වල ඒකාබද්ධ පරිසරය භාවිතා කළ හැකිය.

ෂෙල් වෙඩි මාරු කිරීම

පෙරනිමියෙන් ෂෙල් කළ සංවර්ධන මෙවලම /bin/dashපරිවර්තකයා ලෙස භාවිතා කරයි . /bin/bashවෙබයේ සහ මගේ පරිසරයේ ඇති බොහෝ ෂෙල් උදාහරණ සමඟ වඩා හොඳ අනුකූලතාවයක් ඇති කිරීම සඳහා මම මෙය වෙනස් කළෙමි .

සටහන: ඔබට මෙය වෙනස් කළ හැකිය: කවුළුව -> මනාපය -> ෂෙල් ස්ක්‍රිප්ට් -> පරිවර්තකයන්

උපදෙස් සැකසීම

_DEBUG.shඔබේ ස්ක්‍රිප්ට් නිදොස්කරණය සඳහා මූලික වශයෙන් (readme.txt) ස්ක්‍රිප්ට් භාවිතා කිරීමට පියවර නිදොස් කිරීමේ පැකේජයට ඇත:

  1. ෂෙල් ස්ක්‍රිප්ට් ව්‍යාපෘතිය සාදන්න: ගොනුව -> නව -> වෙනත් -> ෂෙල් ස්ක්‍රිප්ට් -> ෂෙල් ස්ක්‍රිප්ට් ව්‍යාපෘති විශාරද .
  2. Bash ස්ක්‍රිප්ට් ගොනුවක් සාදන්න: ගොනුව -> නව -> ගොනුව . මෙම උදාහරණය සඳහා, එය එසේ වනු ඇත script.sh. දිගුව ".sh" විය යුතු අතර එය අත්‍යවශ්‍ය වේ.
  3. _DEBUG.shව්‍යාපෘති ෆෝල්ඩරයට ගොනුව පිටපත් කරන්න .
  4. ගොනුවේ ඉහළට පහත පෙළ ඇතුල් කරන්න script.sh:

    . _DEBUG.sh
  5. ගොනුව මයික්‍රොසොෆ්ට් වින්ඩෝස් හි නිර්මාණය කර ඇත්නම්, ගොනුව -> පරිවර්තන රේඛා පරිසීමක -> යුනික්ස් වෙත ක්‍රියාත්මක කිරීමට වග බලා ගන්න .

  6. දෝශ නිරාකරණ වින්‍යාසය සකසන්න : ධාවනය -> දෝශ නිරාකරණ වින්‍යාසය -> බෑෂ් ස්ක්‍රිප්ට් ... මෙහි සැකසීමට ක්ෂේත්‍ර 2 ක් ඇත:

    a) "Bash script:" - නිදොස් කිරීම සඳහා සූර්යග්‍රහණයේ වැඩබිමෙහි Bash ස්ක්‍රිප්ටයේ මාර්ගය.
    e) "නිදොස් කිරීමේ වරාය:" 33333

  7. නිදොස් කිරීමේ ඉදිරිදර්ශනයට මාරුවන්න. නිදොස් කිරීමේ සැසිය ආරම්භ කරන්න. බාෂ් script.shකවචයෙන් දියත් කරන්න .

Bash debug UI

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙම bash නිදොස්කරණයෙහි සම්මත ක්‍රමලේඛන නිදොස්කරණය කරන්නන්ගේ සම්පූර්ණ ලක්ෂණ ඇත:

  • බ්‍රේක් පොයින්ට් ටොගල් කරන්න
  • තනි පියවරෙන් පියවර මෙහෙයුම
  • පියවරෙන් පියවර, පියවරෙන් පියවර, පියවරෙන් පියවර කාර්යයන් සහ උප චර්යාවන්
  • ස්ක්‍රිප්ට් ක්‍රියාත්මක වන විට ඕනෑම වේලාවක කේත හෝ විචල්‍යයන් පරීක්ෂා කිරීම

ෂෙල්ඩ් (ෂෙල් ස්ක්‍රිප්ට් කර්තෘ) අයිඩීඊ (ඒකාබද්ධ සංවර්ධන පරිසරය) ඔබේ පිටපත ලිවීමේදී සන්දර්භය පරීක්ෂා කිරීම, ඉස්මතු කිරීම සහ ඉන්ඩෙන්ටින් කිරීම සඳහා අමතර ප්‍රසාද දීමනාවක් ඇත. එය නිවැරදිව ඉන්ඩෙන්ට් නොකළේ නම්, ඔබට වහාම එහි බොහෝ දෝෂ සලකුණු කිරීමට / දේශීය කිරීමට හැකිය.

ඉන්පසු වෙනත් IDE ප්‍රතිලාභද ඇත:

  • TODO කාර්ය ලැයිස්තුව
  • මයිලින් කාර්යය
  • පිටු සලකුණු ලැයිස්තුව
  • බහු කවුළු සංස්කරණය
  • පරිසරය දුරස්ථව බෙදා ගැනීම

සිසිල් ඉඟිය. Bash මේ ආකාරයෙන් නිදොස් කළ හැකි බව දැන ගැනීම සතුටක්.
slm

9

මෑත වසරවලදී අපූරු සම්පතක් දර්ශනය විය: http://shellcheck.net

එය සාමාන්‍ය බාෂ් වලට වඩා වැඩි යමක් ඔබට පෙන්වන අතර, එම කරදරකාරී අනාවරණය නොකළ උපුටා දැක්වීම් හෝ කැරලි වරහන් යනාදිය පහසුවෙන් සොයා ගැනීමට කෙනෙකුට ඉඩ සලසයි.

සංවේදී තොරතුරු (අයිපී, මුරපද, ආදිය) අන්තර්ජාලය හරහා ඇලවීම නොකිරීමට වග බලා ගන්න ... (විශේෂයෙන් එය http, සංකේතනය නොකළ පරිදි) (බාගත කිරීම සඳහා ෂෙල්චෙක් ද ඇති බව මම විශ්වාස කරමි, නමුත් මට විශ්වාස නැත)


8

වර්තමානයේ VS Code Bash Debug ඇත.

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

එයට 'පියවරෙන් පියවර / පිටතට / ඉහළින්' ඇති අතර එක් එක් විචල්‍යයේ වටිනාකම ද පෙන්වයි.

VS Code Bash Debug තිර රුව


මෙම පිළිතුර නිවැරදි සන්දර්භය තුළ ප්‍රශ්නය ආමන්ත්‍රණය නොකරයි; IDE හි සඳහන් නොවූ බැවින් විධාන රේඛාව උපකල්පනය කිරීම
qodeninja

6

සරලව භාවිතා කරන්න:

#!/bin/bash -x

කවචයට සමාන වේ:

#!/bin/sh -x
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.