ෂෙල් විධාන ක්‍රියාත්මක වන විට දෝංකාර දෙන්නේ කෙසේද


955

ෂෙල් ස්ක්‍රිප්ට් එකක, සියලු ෂෙල් විධාන ප්‍රතිරාවය කර ඕනෑම විචල්‍ය නම් පුළුල් කරන්නේ කෙසේද?

උදාහරණයක් ලෙස, පහත දැක්වෙන රේඛාව ලබා දී ඇත:

ls $DIRNAME

ස්ක්‍රිප්ට් එක විධානය ක්‍රියාත්මක කර පහත දැක්වෙන දේ පෙන්වීමට මම කැමතියි

ls /full/path/to/some/dir

මෙහි අරමුණ වන්නේ සියලුම ෂෙල් විධාන සහ ඒවායේ තර්ක වල ලොගයක් සුරැකීමයි. එවැනි ලොගයක් ජනනය කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද?

Answers:


1097

set -xහෝ set -o xtraceවිචල්‍යයන් පුළුල් කර රේඛාවට පෙර කුඩා + ලකුණක් මුද්‍රණය කරයි.

set -vහෝ set -o verboseමුද්‍රණය කිරීමට පෙර විචල්‍යයන් පුළුල් නොකරයි.

භාවිතය set +xසහ set +vඉහත සැකසුම් අක්රිය කිරීමට.

ස්ක්‍රිප්ටයේ පළමු පේළියේ දී, පසුව (හෝ ) ස්ක්‍රිප්ටයට සමාන බලපෑමක් ඇති කිරීමට කෙනෙකුට #!/bin/sh -x(හෝ -v) තැබිය හැකිය .set -x-v

ඉහත සඳහන් දෑ සමඟ ද ක්රියා කරයි /bin/sh.

setගුණාංග සහ නිදොස්කරණය පිළිබඳ බාෂ්-හැකර්වරුන්ගේ විකිය බලන්න .

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

10
කුමන අංකිත රේඛාවක් ක්‍රියාත්මක වේදැයි
user13107

4
විධානය සහ එහි ප්‍රති results ල ප්‍රතිදානය වෙන්කර දැක්වීමට දෝංකාර දෙන විට මට විධානය වර්ණ ගැන්වීමට අවශ්‍ය නම් කුමක් කළ යුතුද?
ලුවිස් චාන්

20
දෝංකාර දෙන විට සෑම විධානයක්ම වාචික-සමාන කථන සංස්ෙල්ෂකයක් හරහා ගායනා කිරීමට මට අවශ්‍ය නම්, එය දුර සිට කරන දේ මට ඇසෙන අතර සංගීතය රස විඳිය හැකිද? යෙදවුම් සහ ප්‍රතිදානයන් සඳහා වෙනත් කටහ in කින් විය හැකිය.
ADJenks

1
@ADJenks +1: DDDDDDD ඔබ මගේ දවස හැදුවා
ඇන්ඩ්‍රියාස්

1
Nd ඇන්ඩ්‍රියාස් ඩීට්‍රිච් ස්තූතියි. මගේ විහිළු ප්‍රශ්නය ක්‍රියාත්මක කිරීමට ඔබ ඇත්තටම ක්‍රමයක් සොයා ගත්තා නම් ඔබ මගේ දවස සාදනු ඇත. වඩාත් ප්‍රබල ක්ලී මෙවලම් සහ කේත පේළි කිහිපයක් සමඟ වඩාත් සුදුසුය.
ඊ.ඩී.ජෙන්ක්ස්

327

set -x ඔබට අවශ්‍ය දේ ඔබට ලබා දෙනු ඇත.

නිරූපණය කිරීම සඳහා උදාහරණ ෂෙල් පිටපතක් මෙන්න:

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

ls $PWD

මෙය සියලු විචල්‍යයන් පුළුල් කරන අතර විධානය ප්‍රතිදානය කිරීමට පෙර සම්පූර්ණ විධාන මුද්‍රණය කරයි.

ප්‍රතිදානය:

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

21
“වාචික” යන වචනය ඒ ආකාරයෙන් භාවිතා කිරීමෙන් කිසිවක් ඉටු නොවේ. ඔබට කළ හැක්කේ set -o verboseහෝ set -v( "වාචික" පමණි ) set -o xtraceහෝ set -x(("xtrace" පමණි) හෝ set -xv(දෙකම) හෝ set -o xtrace -o verbose(දෙකම) පමණි.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

මෙය හොඳට ක්‍රියා කරයි, නමුත් "
වාචික

92

විධානය ප්‍රතිරාවය කිරීමට සහ ක්‍රියාත්මක කිරීමට මම ශ්‍රිතයක් භාවිතා කරමි:

#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }

exe echo hello world

කුමන ප්‍රතිදානයන් ද?

$ echo hello world
hello world

වඩාත් සංකීර්ණ විධාන පයිප්ප ආදිය සඳහා, ඔබට eval භාවිතා කළ හැකිය:

#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }

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

කුමන ප්‍රතිදානයන් ද?

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

මෙම පිළිතුර සඳහා වැඩි ඡන්ද ප්‍රමාණයක් නොමැත. එය නරක අදහසක් වීමට හේතුවක් තිබේද? මා වෙනුවෙන් වැඩ කළ අතර, මම සොයන දේ හරියටම පෙනේ ...
fru1tbat

1
සෑම විධානයක්ම මුද්‍රණය කිරීමට ඔබට අවශ්‍ය නැතිනම් මෙය හොඳම පිළිතුරයි. එය ක්‍රියා ++ set +xවිරහිත කළ විට ප්‍රතිදානය වළක්වයි . එක් ප්‍රකාශයක් හෝ දෙකක් සඳහා, උපසෙල් එකක් භාවිතා කරමින් බාසල්ගේ පිළිතුර වඩාත් පහසුය.
බ්‍රෙන්ට් ෆවුස්ට්

මම සොයන්නේ මෙයයි! නැත set +x, එය සියලු විධානයන්ට බලපායි, එය ඕනෑවට වඩා වැඩිය!
හ්ලුං

11
මෙහි ඇති ප්‍රධාන අවාසිය නම් ප්‍රතිදානය මඟින් උපුටා දැක්වීමේ තොරතුරු නැති වීමයි. උදාහරණයක් ලෙස ඔබට cp "foo bar" bazසහ අතර වෙනස හඳුනාගත නොහැක cp foo "bar baz". එබැවින් පරිශීලකයාට ප්‍රගති තොරතුරු ප්‍රදර්ශනය කිරීම හොඳ ය; ප්‍රතිදානය නිදොස් කිරීම හෝ ප්‍රජනනය කළ හැකි විධාන පටිගත කිරීම සඳහා අඩුය. විවිධ භාවිත අවස්ථා. දී zsh, ඔබට :qනවීකරණය සමඟ උපුටා දැක්වීම සුරැකිය හැක :exe() { echo '$' "${@:q}" ; "$@" ; }
ඇන්ඩ rew ජැන්කේ

2
මම මේ පිළිතුරට කැමති නැහැ. ඔබට පෙනෙන දේ ඔබට නොලැබෙන (විශේෂයෙන් සුදු අවකාශය, උපුටා දැක්වීම්, පැන ගිය අක්ෂර, විචල්ය / ප්‍රකාශන ආදේශක ආදිය) ඇති අද්දර අවස්ථා රාශියක් ඇත, එබැවින් අන්ධ ලෙස දෝංකාර දුන් විධානය පර්යන්තයකට අලවා එය ක්‍රියාත්මක වේ යැයි නොසිතන්න. එකම විදිහේ. එසේම, දෙවන තාක්‍ෂණය හුදෙක් හැක් එකක් වන අතර, ඔබේ විධානයෙන් වචනයේ වෙනත් අවස්ථා ඉවත් කරනු ඇත eval. එබැවින් එය නිසියාකාරව ක්‍රියාත්මක වේ යැයි අපේක්ෂා නොකරන්න exe eval "echo 'eval world'"!
mwfearnley

88

ඔබට මේ ටොගල ඔබගේ කේත රචනය තුල තේරීම් රේඛා සදහා ඔවුන් ඔතන විසින් හැකි 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

56

තෝරාගත් රේඛා ප්‍රතිරාවය කිරීම සඳහා ෂක්ගේ පිළිතුරෙහි අවාසි කිහිපයක් ඇත: ඔබ අවසන් වන්නේ පහත දැක්වෙන set +xවිධානය ද ප්‍රතිරාවය වීමත් සමඟ ය, පිටවීමේ කේතය $?නැවත නැවත ලිවීමෙන් එය පරීක්ෂා කිරීමේ හැකියාව ඔබට අහිමි වේ .set +x වේ.

තවත් විකල්පයක් වන්නේ විධානය උපසිරැසියකින් ධාවනය කිරීමයි:

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

මෙය විධානය සඳහා නව උපසිරැසියක් නිර්මාණය කිරීමේ පොදු කාර්යයට හේතු වේ.


7
++ set +xප්‍රතිදානය වළක්වා ගැනීමට හොඳ ක්‍රමයක් .
බ්‍රෙන්ට් ෆවුස්ට්

3
ඊටත් වඩා හොඳයි: ආදේශ if [ $? -eq 0 ]කරන්න if (set -x; COMMAND).
Amedee Van Gasse

36

තවත් විකල්පයක් වන්නේ විධාන රේඛාව වෙනුවට ඔබේ ස්ක්‍රිප්ටයේ ඉහළින් "-x" තැබීමයි:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

මෙය ./myScriptසහ අතර හරියටම සමාන බවක් නොපෙනෙන බව සලකන්න bash myScript. පෙන්වා දීමට තවමත් හොඳ දෙයක්, ස්තූතියි.
altendky

28

ආරම්භකයින් සඳහා ටීඑල්ඩීපී හි බෑෂ් මාර්ගෝපදේශයට අනුව: 2 වන පරිච්ඡේදය පිටපත් ලිවීම සහ නිදොස්කරණය කිරීම :

2.3.1. සම්පූර්ණ පිටපත නිදොස් කිරීම

$ bash -x script1.sh

...

දී ලබා ගත හැකි බෑෂ් සඳහා අංග සම්පූර්ණ ඩිබගර්, දැන් පවතින සමුදුර . මෙම නිදොස් කිරීමේ අංගයන් 3.x සිට ඇරඹෙන Bash හි බොහෝ නවීන සංස්කරණ වල ඇත.

2.3.2. ස්ක්‍රිප්ටයේ (කොටස්) නිදොස් කිරීම

set -x            # Activate debugging from here
w
set +x            # Stop debugging from here

...

වගුව 2-1. සැකසුම් නිදොස් කිරීමේ විකල්පයන් පිළිබඳ දළ විශ්ලේෂණය

    Short  | Long notation | Result
    -------+---------------+--------------------------------------------------------------
    set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
    set -v | set -o verbose| Prints shell input lines as they are read.
    set -x | set -o xtrace | Print command traces before executing command.

...

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

#!/bin/bash -xv

19

Bash ස්ක්‍රිප්ටයේ නමට පෙර විධාන රේඛාවේ "bash -x" ටයිප් කරන්න. උදාහරණයක් ලෙස, foo.sh ක්‍රියාත්මක කිරීමට, ටයිප් කරන්න:

bash -x foo.sh

13

විකල්පය සමඟ ඔබට දෝශ නිරාකරණ ආකාරයෙන් බාෂ් ස්ක්‍රිප්ට් ක්‍රියාත්මක කළ -xහැකිය .

මෙය සියලු විධාන ප්‍රතිරාවය කරනු ඇත.

bash -x example_script.sh

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

ඔබට ස්ක්‍රිප්ටයේ -x විකල්පය සුරැකිය හැක . -xෂෙබාං හි ඇති විකල්පය සඳහන් කරන්න .

######## 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

2
එසේම bash -vxවිචල්‍ය අන්තර්
මැදිහත්වීමකින්

4

Zsh සඳහා, දෝංකාර දෙන්න

setopt VERBOSE

සහ නිදොස්කරණය සඳහා,

setopt XTRACE

2

සඳහා cshසහ tcsh, ඔබට set verboseහෝset echo (හෝ ඔබ පවා දෙකම සැකසිය හැක, නමුත් එය බොහෝ කාලයක් සමහර අනුපිටපතක් ඇති විය හැක).

එම verbose විකල්පය එච්චරමයි ඔබ ටයිප් කරන නිශ්චිත ෂෙල් ප්රකාශනය මුද්රණය කරයි.

මෙම 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.



1

සංයුක්ත විධාන ප්‍රතිරාවය කිරීමට ඉඩ දීම සඳහා, මම evalප්ලස් සොත් භාවිතා කරමිexe විධානය ප්‍රතිරාවය කිරීමට සහ ක්‍රියාත්මක ශ්‍රිතය . පයිප්ප විධාන සඳහා මෙය ප්‍රයෝජනවත් වන අතර එය වෙනත් කිසිවක් පෙන්වන්නේ නැත.

Eval නොමැතිව:

exe() { echo "\$ $@" ; "$@" ; }
exe ls -F | grep *.txt

නිමැවුම්:

$
file.txt

Ev සමග:

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

කුමන ප්‍රතිදානයන් ද?

$ exe eval 'ls -F | grep *.txt'
file.txt
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.