From f971e8595e3bb33157914f2d53a5dd587a326bb8 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 5 Jan 2022 21:46:33 +0000 Subject: Publishing new version --- gemfeed/2021-11-29-bash-golf-part-1.md | 35 +++++++++++++++++++++++++++++++++- gemfeed/index.md | 2 +- 2 files changed, 35 insertions(+), 2 deletions(-) (limited to 'gemfeed') diff --git a/gemfeed/2021-11-29-bash-golf-part-1.md b/gemfeed/2021-11-29-bash-golf-part-1.md index 7e2cf7e9..2106b3c4 100644 --- a/gemfeed/2021-11-29-bash-golf-part-1.md +++ b/gemfeed/2021-11-29-bash-golf-part-1.md @@ -12,7 +12,7 @@ jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Art by Joan Stark ``` -> Published by Paul Buetow 2021-11-29 +> Published by Paul Buetow 2021-11-29, last updated 2022-01-05 This is the first blog post about my Bash Golf series. This series is about random Bash tips, tricks and weirdnesses I came across. It's a collection of smaller articles I wrote in an older (in German language) blog, which I translated and refreshed with some new content. @@ -167,6 +167,39 @@ One difference is, that the curly braces require you to end the last statement w In case you know more (subtle) differences, please write me an E-Mail and let me know. +> Update: A reader sent me an E-Mail and pointed me to the Bash manual page, which explains the difference between () and {} (I should have checked that by myself): + +``` +(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT + below). Variable assignments and builtin commands that affect the shell's + environment do not remain in effect after the command completes. The return + status is the exit status of list. + +{ list; } + list is simply executed in the current shell environment. list must be ter‐ + minated with a newline or semicolon. This is known as a group command. The + return status is the exit status of list. Note that unlike the metacharac‐ + ters ( and ), { and } are reserved words and must occur where a reserved word + is permitted to be recognized. Since they do not cause a word break, they + must be separated from list by whitespace or another shell metacharacter. +``` + +So I was right that () is executed in a subprocess. But why does $$ not show a different PID? Also here (as pointed out by the reader) is the answer in the manual page: + +``` +$ Expands to the process ID of the shell. In a () subshell, it expands to the + process ID of the current shell, not the subshell. +``` + +If we want print the subprocess PID, we can use the BASHPID variable: + +``` +❯ echo $BASHPID; { echo $BASHPID; }; ( echo $BASHPID; ) +1028465 +1028465 +1028739 +``` + ## Expansions Let's start with simple examples: diff --git a/gemfeed/index.md b/gemfeed/index.md index fa507d17..28cf46d0 100644 --- a/gemfeed/index.md +++ b/gemfeed/index.md @@ -4,7 +4,7 @@ [2022-01-01 (1077 words) - Bash Golf Part 2](./2022-01-01-bash-golf-part-2.md) [2021-12-26 (2101 words) - How to stay sane as a DevOps person ](./2021-12-26-how-to-stay-sane-as-a-devops-person.md) -[2021-11-29 (1199 words) - Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md) +[2021-11-29 (1281 words) - Bash Golf Part 1](./2021-11-29-bash-golf-part-1.md) [2021-10-22 (2276 words) - Defensive DevOps](./2021-10-22-defensive-devops.md) [2021-09-12 (1365 words) - Keep it simple and stupid](./2021-09-12-keep-it-simple-and-stupid.md) [2021-08-01 (2919 words) - On being Pedantic about Open-Source](./2021-08-01-on-being-pedantic-about-open-source.md) -- cgit v1.2.3