Your SlideShare is downloading. ×
0
The Bash: Defensive Scripting      The Bash: Defensive Scripting                        1Montag, 29. August 11
The Bash: Defensive Scripting                        2Montag, 29. August 11
The Bash: Defensive Scripting         Unix                        2Montag, 29. August 11
The Bash: Defensive Scripting         Unix         Interfaces                        2Montag, 29. August 11
The Bash: Defensive Scripting         Unix         Interfaces         Re-use                        2Montag, 29. August 11
The Bash: Defensive Scripting         Unix         Interfaces         Re-use         Defensive Programming                ...
The Bash: Defensive Scripting         Unix         Interfaces         Re-use         Defensive Programming         Reading...
The Bash: Defensive Scripting                        3Montag, 29. August 11
The Bash: Defensive Scripting         Unix                        3Montag, 29. August 11
The Bash: Defensive Scripting         Unix         • Be forgiving in what you accept, but                   strict in what...
The Bash: Defensive Scripting         Unix         • Be forgiving in what you accept, but           strict in what you emi...
The Bash: Defensive Scripting         Unix         • Be forgiving in what you accept, but           strict in what you emi...
The Bash: Defensive Scripting         Unix         • Be forgiving in what you accept, but           strict in what you emi...
The Bash: Defensive Scripting         Unix         • Be forgiving in what you accept, but                   strict in what...
The Bash: Defensive Scripting                        4Montag, 29. August 11
The Bash: Defensive Scripting         Unix: The Unix Toolbox                        4Montag, 29. August 11
The Bash: Defensive Scripting         Unix: The Unix Toolbox         Get familiar with cat, cut, tee, uniq,         sort, ...
The Bash: Defensive Scripting         Unix: The Unix Toolbox         Get familiar with cat, cut, tee, uniq,         sort, ...
The Bash: Defensive Scripting         Unix: The Unix Toolbox         Get familiar with cat, cut, tee, uniq,         sort, ...
The Bash: Defensive Scripting                        5Montag, 29. August 11
The Bash: Defensive Scripting         Interfaces                        5Montag, 29. August 11
The Bash: Defensive Scripting         Interfaces         • stdin, stdout, stderr, exit code                            5Mo...
The Bash: Defensive Scripting         Interfaces         • stdin, stdout, stderr, exit code         • Favour plain text   ...
The Bash: Defensive Scripting         Interfaces         • stdin, stdout, stderr, exit code         • Favour plain text   ...
The Bash: Defensive Scripting         Interfaces         •         stdin, stdout, stderr, exit code         •         Favo...
The Bash: Defensive Scripting                        6Montag, 29. August 11
The Bash: Defensive Scripting         Interfaces: Filter                        6Montag, 29. August 11
Upcoming SlideShare
Loading in...5
×

The bash – defensive scripting

1,272

Published on

Fairly basic introduction to some principles and techniques for creating safe, fault-tolerant unix scripts using the Bash environment.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,272
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "The bash – defensive scripting"

  1. 1. The Bash: Defensive Scripting The Bash: Defensive Scripting 1Montag, 29. August 11
  2. 2. The Bash: Defensive Scripting 2Montag, 29. August 11
  3. 3. The Bash: Defensive Scripting Unix 2Montag, 29. August 11
  4. 4. The Bash: Defensive Scripting Unix Interfaces 2Montag, 29. August 11
  5. 5. The Bash: Defensive Scripting Unix Interfaces Re-use 2Montag, 29. August 11
  6. 6. The Bash: Defensive Scripting Unix Interfaces Re-use Defensive Programming 2Montag, 29. August 11
  7. 7. The Bash: Defensive Scripting Unix Interfaces Re-use Defensive Programming Readings 2Montag, 29. August 11
  8. 8. The Bash: Defensive Scripting 3Montag, 29. August 11
  9. 9. The Bash: Defensive Scripting Unix 3Montag, 29. August 11
  10. 10. The Bash: Defensive Scripting Unix • Be forgiving in what you accept, but strict in what you emit 3Montag, 29. August 11
  11. 11. The Bash: Defensive Scripting Unix • Be forgiving in what you accept, but strict in what you emit • If you must fail, do so early and noisily 3Montag, 29. August 11
  12. 12. The Bash: Defensive Scripting Unix • Be forgiving in what you accept, but strict in what you emit • If you must fail, do so early and noisily • One tool for each task 3Montag, 29. August 11
  13. 13. The Bash: Defensive Scripting Unix • Be forgiving in what you accept, but strict in what you emit • If you must fail, do so early and noisily • One tool for each task • Human-readable data and protocols 3Montag, 29. August 11
  14. 14. The Bash: Defensive Scripting Unix • Be forgiving in what you accept, but strict in what you emit • If you must fail, do so early and noisily • One tool for each task • Human-readable data and protocols • Do the simplest thing that will do 3Montag, 29. August 11
  15. 15. The Bash: Defensive Scripting 4Montag, 29. August 11
  16. 16. The Bash: Defensive Scripting Unix: The Unix Toolbox 4Montag, 29. August 11
  17. 17. The Bash: Defensive Scripting Unix: The Unix Toolbox Get familiar with cat, cut, tee, uniq, sort, head, tail, but also grep, sed, diff, find and possibly even awk. They will save you a whole lot of work. 4Montag, 29. August 11
  18. 18. The Bash: Defensive Scripting Unix: The Unix Toolbox Get familiar with cat, cut, tee, uniq, sort, head, tail, but also grep, sed, diff, find and possibly even awk. They will save you a whole lot of work. For more inspiration: ls /usr/bin 4Montag, 29. August 11
  19. 19. The Bash: Defensive Scripting Unix: The Unix Toolbox Get familiar with cat, cut, tee, uniq, sort, head, tail, but also grep, sed, diff, find and possibly even awk. They will save you a whole lot of work. For more inspiration: ls /usr/bin Extend your Unix Toolbox 4Montag, 29. August 11
  20. 20. The Bash: Defensive Scripting 5Montag, 29. August 11
  21. 21. The Bash: Defensive Scripting Interfaces 5Montag, 29. August 11
  22. 22. The Bash: Defensive Scripting Interfaces • stdin, stdout, stderr, exit code 5Montag, 29. August 11
  23. 23. The Bash: Defensive Scripting Interfaces • stdin, stdout, stderr, exit code • Favour plain text 5Montag, 29. August 11
  24. 24. The Bash: Defensive Scripting Interfaces • stdin, stdout, stderr, exit code • Favour plain text • Treat comments as comments 5Montag, 29. August 11
  25. 25. The Bash: Defensive Scripting Interfaces • stdin, stdout, stderr, exit code • Favour plain text • Treat comments as comments • Filter, Source, Sink, Cantrip, Compiler 5Montag, 29. August 11
  26. 26. The Bash: Defensive Scripting 6Montag, 29. August 11
  27. 27. The Bash: Defensive Scripting Interfaces: Filter 6Montag, 29. August 11
  28. 28. The Bash: Defensive Scripting Interfaces: Filter Read from stdin, write to stdout 6Montag, 29. August 11
  29. 29. The Bash: Defensive Scripting Interfaces: Filter Read from stdin, write to stdout Perfect for pipes 6Montag, 29. August 11
  30. 30. The Bash: Defensive Scripting Interfaces: Filter Read from stdin, write to stdout Perfect for pipes Example: cut 6Montag, 29. August 11
  31. 31. The Bash: Defensive Scripting 7Montag, 29. August 11
  32. 32. The Bash: Defensive Scripting Interfaces: Source 7Montag, 29. August 11
  33. 33. The Bash: Defensive Scripting Interfaces: Source Read from file, write to stdout 7Montag, 29. August 11
  34. 34. The Bash: Defensive Scripting Interfaces: Source Read from file, write to stdout Interface to outer world, beginning of a pipe sequence 7Montag, 29. August 11
  35. 35. The Bash: Defensive Scripting Interfaces: Source Read from file, write to stdout Interface to outer world, beginning of a pipe sequence Example: cat 7Montag, 29. August 11
  36. 36. The Bash: Defensive Scripting 8Montag, 29. August 11
  37. 37. The Bash: Defensive Scripting Interfaces: Sink 8Montag, 29. August 11
  38. 38. The Bash: Defensive Scripting Interfaces: Sink Read from stdin, write to file 8Montag, 29. August 11
  39. 39. The Bash: Defensive Scripting Interfaces: Sink Read from stdin, write to file Interface to outer world, end of a pipe sequence 8Montag, 29. August 11
  40. 40. The Bash: Defensive Scripting Interfaces: Sink Read from stdin, write to file Interface to outer world, end of a pipe sequence Example: > 8Montag, 29. August 11
  41. 41. The Bash: Defensive Scripting 9Montag, 29. August 11
  42. 42. The Bash: Defensive Scripting Interfaces: Cantrip 9Montag, 29. August 11
  43. 43. The Bash: Defensive Scripting Interfaces: Cantrip Do sth. and return nothing but a status code (or errors) 9Montag, 29. August 11
  44. 44. The Bash: Defensive Scripting Interfaces: Cantrip Do sth. and return nothing but a status code (or errors) This is super scriptable 9Montag, 29. August 11
  45. 45. The Bash: Defensive Scripting Interfaces: Cantrip Do sth. and return nothing but a status code (or errors) This is super scriptable Example: rm 9Montag, 29. August 11
  46. 46. The Bash: Defensive Scripting 10Montag, 29. August 11
  47. 47. The Bash: Defensive Scripting Interfaces: Compiler 10Montag, 29. August 11
  48. 48. The Bash: Defensive Scripting Interfaces: Compiler Read from file, write to another file 10Montag, 29. August 11
  49. 49. The Bash: Defensive Scripting Interfaces: Compiler Read from file, write to another file Example: tar 10Montag, 29. August 11
  50. 50. The Bash: Defensive Scripting 11Montag, 29. August 11
  51. 51. The Bash: Defensive Scripting Re-use 11Montag, 29. August 11
  52. 52. The Bash: Defensive Scripting Re-use • Functions 11Montag, 29. August 11
  53. 53. The Bash: Defensive Scripting Re-use • Functions • Wrappers 11Montag, 29. August 11
  54. 54. The Bash: Defensive Scripting Re-use • Functions • Wrappers • $() (aka ``) 11Montag, 29. August 11
  55. 55. The Bash: Defensive Scripting Re-use • Functions • Wrappers • $() (aka ``) • source (aka ‘.’) 11Montag, 29. August 11
  56. 56. The Bash: Defensive Scripting 12Montag, 29. August 11
  57. 57. The Bash: Defensive Scripting Re-use: Functions 12Montag, 29. August 11
  58. 58. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own 12Montag, 29. August 11
  59. 59. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own function log { 12Montag, 29. August 11
  60. 60. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own function log { echo “$(date) ERR $@” >&2 12Montag, 29. August 11
  61. 61. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own function log { echo “$(date) ERR $@” >&2 } 12Montag, 29. August 11
  62. 62. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own function log { echo “$(date) ERR $@” >&2 } log “Cannot connect” 12Montag, 29. August 11
  63. 63. The Bash: Defensive Scripting Re-use: Functions Will behave like a script on its own function log { echo “$(date) ERR $@” >&2 } log “Cannot connect” # Do 4 Aug 2011 10:38:58 CEST ERR Cannot connect 12Montag, 29. August 11
  64. 64. The Bash: Defensive Scripting 13Montag, 29. August 11
  65. 65. The Bash: Defensive Scripting Re-use: Wrappers 13Montag, 29. August 11
  66. 66. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash 13Montag, 29. August 11
  67. 67. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if 13Montag, 29. August 11
  68. 68. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if # necessary and cd to it 13Montag, 29. August 11
  69. 69. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if # necessary and cd to it test -n “$1” || exit 1 13Montag, 29. August 11
  70. 70. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if # necessary and cd to it test -n “$1” || exit 1 newdir=”$1” 13Montag, 29. August 11
  71. 71. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if # necessary and cd to it test -n “$1” || exit 1 newdir=”$1” test -d $newdir || mkdir $newdir 13Montag, 29. August 11
  72. 72. The Bash: Defensive Scripting Re-use: Wrappers #!/bin/bash # file mcd -- make a dir if # necessary and cd to it test -n “$1” || exit 1 newdir=”$1” test -d $newdir || mkdir $newdir cd $newdir 13Montag, 29. August 11
  73. 73. The Bash: Defensive Scripting 14Montag, 29. August 11
  74. 74. The Bash: Defensive Scripting Re-use: $() 14Montag, 29. August 11
  75. 75. The Bash: Defensive Scripting Re-use: $() More readable than `backticks` 14Montag, 29. August 11
  76. 76. The Bash: Defensive Scripting Re-use: $() More readable than `backticks` myfiles=$(ls $HOME) 14Montag, 29. August 11
  77. 77. The Bash: Defensive Scripting 15Montag, 29. August 11
  78. 78. The Bash: Defensive Scripting Re-use: source 15Montag, 29. August 11
  79. 79. The Bash: Defensive Scripting Re-use: source More readable than “.” 15Montag, 29. August 11
  80. 80. The Bash: Defensive Scripting Re-use: source More readable than “.” source $HOME/lib/basics.sh 15Montag, 29. August 11
  81. 81. The Bash: Defensive Scripting Re-use: source More readable than “.” source $HOME/lib/basics.sh source /etc/conf/script.cnf 15Montag, 29. August 11
  82. 82. The Bash: Defensive Scripting 16Montag, 29. August 11
  83. 83. The Bash: Defensive Scripting Defensive Programming 16Montag, 29. August 11
  84. 84. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) 16Montag, 29. August 11
  85. 85. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find 16Montag, 29. August 11
  86. 86. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find • && and || (AND and OR) 16Montag, 29. August 11
  87. 87. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find • && and || (AND and OR) • trap 16Montag, 29. August 11
  88. 88. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find • && and || (AND and OR) • trap • log, stderr 16Montag, 29. August 11
  89. 89. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find • && and || (AND and OR) • trap • log, stderr • --help, --version, usage() 16Montag, 29. August 11
  90. 90. The Bash: Defensive Scripting Defensive Programming • test, test, test (for $?) • find • && and || (AND and OR) • trap • log, stderr • --help, --version, usage() • Use full path names 16Montag, 29. August 11
  91. 91. The Bash: Defensive Scripting 17Montag, 29. August 11
  92. 92. The Bash: Defensive Scripting Defensive Programming: test 17Montag, 29. August 11
  93. 93. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” 17Montag, 29. August 11
  94. 94. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” test -d “$destdir” 17Montag, 29. August 11
  95. 95. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” test -d “$destdir” test -x “$script” 17Montag, 29. August 11
  96. 96. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” test -d “$destdir” test -x “$script” test -w “$destfile” 17Montag, 29. August 11
  97. 97. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” test -d “$destdir” test -x “$script” test -w “$destfile” test -n “$variable” 17Montag, 29. August 11
  98. 98. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” test -d “$destdir” test -x “$script” test -w “$destfile” test -n “$variable” test -z “$nothing” 17Montag, 29. August 11
  99. 99. The Bash: Defensive Scripting 18Montag, 29. August 11
  100. 100. The Bash: Defensive Scripting Defensive Programming: test 18Montag, 29. August 11
  101. 101. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” 18Montag, 29. August 11
  102. 102. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” if [[ $? = 0 ]]; then 18Montag, 29. August 11
  103. 103. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” if [[ $? = 0 ]]; then echo “yes, it’s readable” 18Montag, 29. August 11
  104. 104. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” if [[ $? = 0 ]]; then echo “yes, it’s readable” else 18Montag, 29. August 11
  105. 105. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” if [[ $? = 0 ]]; then echo “yes, it’s readable” else echo “cannot read $sourcefile” 18Montag, 29. August 11
  106. 106. The Bash: Defensive Scripting Defensive Programming: test test -r “$sourcefile” if [[ $? = 0 ]]; then echo “yes, it’s readable” else echo “cannot read $sourcefile” fi 18Montag, 29. August 11
  107. 107. The Bash: Defensive Scripting 19Montag, 29. August 11
  108. 108. The Bash: Defensive Scripting Defensive Programming: && and || 19Montag, 29. August 11
  109. 109. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” || exit 1 19Montag, 29. August 11
  110. 110. The Bash: Defensive Scripting 20Montag, 29. August 11
  111. 111. The Bash: Defensive Scripting Defensive Programming: && and || 20Montag, 29. August 11
  112. 112. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” || { 20Montag, 29. August 11
  113. 113. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” || { echo “Cannot read source file” >&2 20Montag, 29. August 11
  114. 114. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” || { echo “Cannot read source file” >&2 exit 1 20Montag, 29. August 11
  115. 115. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” || { echo “Cannot read source file” >&2 exit 1 } 20Montag, 29. August 11
  116. 116. The Bash: Defensive Scripting 21Montag, 29. August 11
  117. 117. The Bash: Defensive Scripting Defensive Programming: && and || 21Montag, 29. August 11
  118. 118. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { 21Montag, 29. August 11
  119. 119. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { cat -n “$sourcefile” 21Montag, 29. August 11
  120. 120. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { cat -n “$sourcefile” } || { 21Montag, 29. August 11
  121. 121. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { cat -n “$sourcefile” } || { echo “Cannot read source file” >&2 21Montag, 29. August 11
  122. 122. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { cat -n “$sourcefile” } || { echo “Cannot read source file” >&2 exit 1 21Montag, 29. August 11
  123. 123. The Bash: Defensive Scripting Defensive Programming: && and || test -r “$sourcefile” && { cat -n “$sourcefile” } || { echo “Cannot read source file” >&2 exit 1 } 21Montag, 29. August 11
  124. 124. The Bash: Defensive Scripting 22Montag, 29. August 11
  125. 125. The Bash: Defensive Scripting Defensive Programming: find 22Montag, 29. August 11
  126. 126. The Bash: Defensive Scripting Defensive Programming: find Don’t rely on a file being in some exact place. If it needs to be, tell the user. 22Montag, 29. August 11
  127. 127. The Bash: Defensive Scripting Defensive Programming: find Don’t rely on a file being in some exact place. If it needs to be, tell the user. find Syntax is a bit peculiar. 22Montag, 29. August 11
  128. 128. The Bash: Defensive Scripting Defensive Programming: find Don’t rely on a file being in some exact place. If it needs to be, tell the user. find Syntax is a bit peculiar. find $install_dir -name “*README*” -type f -exec mv {} $install_dir/docs/ ; 22Montag, 29. August 11
  129. 129. The Bash: Defensive Scripting 23Montag, 29. August 11
  130. 130. The Bash: Defensive Scripting Defensive Programming: trap 23Montag, 29. August 11
  131. 131. The Bash: Defensive Scripting Defensive Programming: trap trap “/bin/rm -f $tmpf; exit” EXIT 23Montag, 29. August 11
  132. 132. The Bash: Defensive Scripting Defensive Programming: trap trap “/bin/rm -f $tmpf; exit” EXIT trap “source $config” SIGHUP 23Montag, 29. August 11
  133. 133. The Bash: Defensive Scripting function log { msg=“$(date) ERR $@” test -w $LOGF && echo $msg > $LOGF echo $msg >&2 } 24Montag, 29. August 11
  134. 134. The Bash: Defensive Scripting Defensive Programming: Logs function log { msg=“$(date) ERR $@” test -w $LOGF && echo $msg > $LOGF echo $msg >&2 } 24Montag, 29. August 11
  135. 135. The Bash: Defensive Scripting Defensive Programming: Logs Write status to stderr. stderr is not for *errors* only, but for all kind of metainformation function log { msg=“$(date) ERR $@” test -w $LOGF && echo $msg > $LOGF echo $msg >&2 } 24Montag, 29. August 11
  136. 136. The Bash: Defensive Scripting Defensive Programming: Logs Write status to stderr. stderr is not for *errors* only, but for all kind of metainformation Use syslog/logger or your own logging function function log { msg=“$(date) ERR $@” test -w $LOGF && echo $msg > $LOGF echo $msg >&2 } 24Montag, 29. August 11
  137. 137. The Bash: Defensive Scripting 25Montag, 29. August 11
  138. 138. The Bash: Defensive Scripting Defensive Programming: 25Montag, 29. August 11
  139. 139. The Bash: Defensive Scripting Defensive Programming: --help, --version 25Montag, 29. August 11
  140. 140. The Bash: Defensive Scripting Defensive Programming: --help, --version • Simplify the use of your program by providing --help and --version 25Montag, 29. August 11
  141. 141. The Bash: Defensive Scripting Defensive Programming: --help, --version • Simplify the use of your program by providing --help and --version • On error print a usage message 25Montag, 29. August 11
  142. 142. The Bash: Defensive Scripting 26Montag, 29. August 11
  143. 143. The Bash: Defensive Scripting Defensive Programming: 26Montag, 29. August 11
  144. 144. The Bash: Defensive Scripting Defensive Programming: use full path names 26Montag, 29. August 11
  145. 145. The Bash: Defensive Scripting Defensive Programming: use full path names base=$HOME/install 26Montag, 29. August 11
  146. 146. The Bash: Defensive Scripting Defensive Programming: use full path names base=$HOME/install srcf=$base/source.txt 26Montag, 29. August 11
  147. 147. The Bash: Defensive Scripting Defensive Programming: use full path names base=$HOME/install srcf=$base/source.txt dstf=$base/destination.txt 26Montag, 29. August 11
  148. 148. The Bash: Defensive Scripting Defensive Programming: use full path names base=$HOME/install srcf=$base/source.txt dstf=$base/destination.txt test -r $srcf && cp -i $srcf $dstf 26Montag, 29. August 11
  149. 149. The Bash: Defensive Scripting 27Montag, 29. August 11
  150. 150. The Bash: Defensive Scripting Readings 27Montag, 29. August 11
  151. 151. The Bash: Defensive Scripting Readings • Advanced Bash-Scripting Guide http:// tldp.org/LDP/abs/html/ 27Montag, 29. August 11
  152. 152. The Bash: Defensive Scripting Readings • Advanced Bash-Scripting Guide http:// tldp.org/LDP/abs/html/ • The Art of Unix Programming (by Eric S. Raymond; http://www.faqs.org/docs/artu/) 27Montag, 29. August 11
  153. 153. The Bash: Defensive Scripting Readings • Advanced Bash-Scripting Guide http:// tldp.org/LDP/abs/html/ • The Art of Unix Programming (by Eric S. Raymond; http://www.faqs.org/docs/artu/) • Wicked Cool Shell Scripts (No Starch Press) 27Montag, 29. August 11
  154. 154. The Bash: Defensive Scripting Readings • Advanced Bash-Scripting Guide http:// tldp.org/LDP/abs/html/ • The Art of Unix Programming (by Eric S. Raymond; http://www.faqs.org/docs/artu/) • Wicked Cool Shell Scripts (No Starch Press) • Patrick Jezek: Bash Techtalk (08/2010) http://slides.liip.ch/shell_scripting/ index.html 27Montag, 29. August 11
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×