From 7bceca514152934fd50d3e651cebebca6cdd9116 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 5 Jan 2022 21:46:31 +0000 Subject: Publishing new version --- gemfeed/2021-11-29-bash-golf-part-1.html | 29 ++++++++++++++++++++++++++++- gemfeed/atom.xml | 31 +++++++++++++++++++++++++++++-- gemfeed/index.html | 2 +- 3 files changed, 58 insertions(+), 4 deletions(-) (limited to 'gemfeed') diff --git a/gemfeed/2021-11-29-bash-golf-part-1.html b/gemfeed/2021-11-29-bash-golf-part-1.html index 415654d0..075b5de8 100644 --- a/gemfeed/2021-11-29-bash-golf-part-1.html +++ b/gemfeed/2021-11-29-bash-golf-part-1.html @@ -19,7 +19,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.

Bash Golf Part 1 (you are reding this atm.)
Bash Golf Part 2
@@ -142,6 +142,33 @@ foo bar baz > ^C

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/atom.xml b/gemfeed/atom.xml
index c26684af..73fd6b3f 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,6 +1,6 @@
 
 
-    2022-01-03T10:59:45+00:00
+    2022-01-05T21:44:28+00:00
     snonux.de feed
     Having fun with computers!
     
@@ -521,7 +521,7 @@ PAUL:X:1000:1000:PAUL BUETOW:/HOME/PAUL:/BIN/BASH
 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.

Bash Golf Part 1 (you are reding this atm.)
Bash Golf Part 2
@@ -644,6 +644,33 @@ foo bar baz > ^C

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.html b/gemfeed/index.html
index c64fa0f2..188798c8 100644
--- a/gemfeed/index.html
+++ b/gemfeed/index.html
@@ -11,7 +11,7 @@
 

Having fun with computers!

2022-01-01 (1077 words) - Bash Golf Part 2
2021-12-26 (2101 words) - How to stay sane as a DevOps person
-2021-11-29 (1199 words) - Bash Golf Part 1
+2021-11-29 (1281 words) - Bash Golf Part 1
2021-10-22 (2276 words) - Defensive DevOps
2021-09-12 (1365 words) - Keep it simple and stupid
2021-08-01 (2919 words) - On being Pedantic about Open-Source
-- cgit v1.2.3