diff options
Diffstat (limited to '_notes/bash.md')
-rw-r--r-- | _notes/bash.md | 208 |
1 files changed, 0 insertions, 208 deletions
diff --git a/_notes/bash.md b/_notes/bash.md deleted file mode 100644 index dfc7f57..0000000 --- a/_notes/bash.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Bash -subtitle: best practices -layout: plain ---- - -Arrays ------- - -### Declaration - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -local -a xs=() -declare -a xs=() -local -A xs=() -declare -A xs=() - -# Works with nounset: -echo "${#xs[@]}" -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -local -a xs -declare -a xs -local -A xs -declare -A xs - -# Doesn't work with nounset: -echo "${#xs[@]}" -``` - - </div> -</div> - -### Expansion - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -func ${arr[@]+"${arr[@]}"} -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -# Doesn't work with nounset: -func "${arr[@]}" -# Doesn't work properly with `declare -a arr=('')`: -func "${arr[@]+"${arr[@]}"}" -``` - - </div> -</div> - -### `unset` - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -unset -v 'arr[x]' -unset -v 'arr[$i]' -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -# May break due to globbing: -unset -v arr[x] -# In addition, possible quoting problem: -unset -v arr[$i] -# Doesn't work for some reason: -unset -v 'arr["x"]' -unset -v 'arr["]"]' -# Also rejected: -unset -v 'arr["$i"]' - -# An insightful discussion on the topic: -# https://lists.gnu.org/archive/html/help-bash/2016-09/msg00020.html -``` - - </div> -</div> - -`errexit` ---------- - -I hate this feature, and I especially hate people who prefer "standards" over -useful behaviour. - -### Command substitution - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -# Without this, bar will be executed w/ errexit disabled! -shopt -s inherit_errexit - -bar() { - false - echo 'should never see this' >&2 -} - -bar_output="$( bar )" -foo "$bar_output" -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -bar() { - false - echo 'should never see this' >&2 -} - -# Even with errexit, foo will still get executed. -# More than that, the script will print 'should never see this'! -foo "$( bar )" -``` - - </div> -</div> - -### Process substitution - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -shopt -s lastpipe - -command | while IFS= read -r line; do - process_line "$line" -done -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -# Without lastpipe, you cannot pipe into read: -command | while IFS= read -r line; do - process_line "$line" -done -``` - -```bash -# errexit doesn't work here no matter what: -while IFS= read -r line; do - process_line "$line" -done < <( command ) -echo 'should never see this' -``` - -```bash -# This would break if $output contains the \0 byte: -output="$( command )" - -while IFS= read -r line; do - process_line "$line" -done <<< "$output" -``` - - </div> -</div> - -### Functions - -<div class="row"> - <div class="col-md-6" markdown="1"> - -```bash -foo() { - false - echo 'should never see this' >&2 -} - -foo -echo ok -``` - - </div> - <div class="col-md-6" markdown="1"> - -```bash -# foo will still print 'should never see this'. -if foo; then - echo ok -fi - -# Same below. -foo && echo ok -foo || echo ok -``` - - </div> -</div> |