Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
Showing results for 
Search instead for 
Did you mean: 
Developer Advocate
Developer Advocate
This is a searchable description of the content of a live stream recording, specifically “Ep.39 – Looking at process substitution” in the “Hands-on SAP dev with qmacro” series. There are links directly to specific highlights in the video recording. For links to annotations of other episodes, please see the “Catch the replays” section of the series blog post.

This episode, titled “Looking at process substitution“, was streamed live on Sun 06 Oct 2019 and is approximately 10 minutes in length. The stream recording is available on YouTube.

Brief synopsis: This is an impromptu live stream where we look briefly at process substitution in the shell, a powerful construct useful for command line processing.

00:10 Explaining the purpose of this impromptu episode on a Sunday morning, to test out a reconfiguration of my OBS streaming software - to encode and stream a smaller base canvas in order to try and reduce the load on the machine (I noticed an increase load since I started to use a 4K monitor).

01:30 Taking a quick look at the Window Manager (WM) Amethyst that I’m trying out instead of ChunkWM.

02:30 Looking at what we did at the end of the previous episode (Ep38) - comparing two different JSON representations of the Core Schema Notation (CSN) for the Business Partner API. In the previous episode we created intermediate files before firing up vimdiff. This works but is a little pedestrian and we have to remember to clean up those files afterwards.

04:50 I discovered the concept of Process Substitution a few weeks ago, which is a shell feature. Looking at the Wikipedia entry for Process Substitution we see a nice succinct and helpful definition, telling us that it “… allows the input or output of a command to appear as a file”. This will enable us to use vimdiff, which expects to work on files, with the STDOUT of sub processes (rather than having to create intermediate files). Amazing!

06:20 Reminding ourselves of what we did previously:
jq < ./API_BUSINESS_PARTNER.json > tut.json
jq < ./conv/API_BUSINESS_PARTNER.json > new.json # the file we created with edmx2csn

vimdiff tut.json new.json
rm tut.json new.json

07:35 With process substitution in Bash, we have the <() construct for input; there’s also <() for output, which we don’t use here. This is all we have to do:
vimdiff <(jq < ./API_BUSINESS.PARTNER.json) <(jq < ./conv/API_BUSINESS_PARTNER.json)

No pre-step to create files, and no cleanup of those files afterwards. Beautiful.

08:30 Noting that the “file” names (e.g. /dev/fd/63) in Vim are non-writeable “file descriptors” which you’ll learn more about when you look into how process substitution works.

09:30 We see that process substitution first appeared in the Korn shell in 1988. The Korn shell was written by David Korn, who I’ve seen modelling a tshirt with a wonderful statement on the front that I think should make it onto a #HandsOnSAPDev tshirt, don’t you? 🙂