The document discusses useless uses of common Unix/Linux utilities like cat, grep, and *. It provides examples of cases where these utilities are used redundantly or ineffectively, and suggests better alternatives without the unnecessary steps. Specifically, it explains how cat is often redundant when feeding files into other commands directly, how grep can be replaced by simpler tools like awk and sed in many cases, and how using * wildcards without good reason leads to inefficient scripts. The overall message is to simplify commands and remove unnecessary processing to write clearer and more efficient shell scripts.
The document proposes a PGP-based social network called "PGPBook" that combines PGP encryption, the PGP web of trust model, and a friend-to-friend network structure. It would use a user's PGP public key and locally signed keys from friends to build a social graph and verify accounts. The goal is to provide more privacy and authentication than typical social networks by leveraging PGP's cryptographic features while expanding its use. Concerns include reliance on secure private keys and lack of mass adoption of PGP. Feedback on the concept is welcomed.
Semper Ubi Sub Ubi - Things They Don't Teach You In SchoolJan Schaumann
'Always wear underwear' and other practical advice for Computer Science students.
A transcript of the talk is available at www.netmeister.org/blog/semper-ubi-sub-ubi.html
The Razors Edge - Cutting your TLS BaggageJan Schaumann
A talk on effecting change across a large organization, given at O'Reilly Security 2017.
Write-up will be posted at https://www.netmeister.org/blog/razors-edge.html
A Choose Your Own Adventure for Devs, Ops, and other Humans
Given at ConFoo Vancouver 2016.
Write-up will be posted at https://www.netmeister.org/blog/opsec101.html
Crazy Like A Fox - #Infosec Ideas That Just Might WorkJan Schaumann
Slides from an Ignite Talk given at O'Reilly Security NYC, 2016-10-31. Talk details will be posted at https://www.netmeister.org/blog/crazy-like-a-fox.html
The document proposes a PGP-based social network called "PGPBook" that combines PGP encryption, the PGP web of trust model, and a friend-to-friend network structure. It would use a user's PGP public key and locally signed keys from friends to build a social graph and verify accounts. The goal is to provide more privacy and authentication than typical social networks by leveraging PGP's cryptographic features while expanding its use. Concerns include reliance on secure private keys and lack of mass adoption of PGP. Feedback on the concept is welcomed.
Semper Ubi Sub Ubi - Things They Don't Teach You In SchoolJan Schaumann
'Always wear underwear' and other practical advice for Computer Science students.
A transcript of the talk is available at www.netmeister.org/blog/semper-ubi-sub-ubi.html
The Razors Edge - Cutting your TLS BaggageJan Schaumann
A talk on effecting change across a large organization, given at O'Reilly Security 2017.
Write-up will be posted at https://www.netmeister.org/blog/razors-edge.html
A Choose Your Own Adventure for Devs, Ops, and other Humans
Given at ConFoo Vancouver 2016.
Write-up will be posted at https://www.netmeister.org/blog/opsec101.html
Crazy Like A Fox - #Infosec Ideas That Just Might WorkJan Schaumann
Slides from an Ignite Talk given at O'Reilly Security NYC, 2016-10-31. Talk details will be posted at https://www.netmeister.org/blog/crazy-like-a-fox.html
Primum non nocere - Ethical Obligations in Internet OperationsJan Schaumann
The document discusses ethical obligations in internet operations and data stewardship. It notes that companies are stewards of users' data and are obligated to act in the public interest. Various codes of ethics from different organizations emphasize prioritizing public safety, health and welfare.
Safely Drinking from the Data WaterhoseJan Schaumann
An ingite talk given at DataGotham 2012 about how we extract security related events and alerts from our logs. I repeated the same talk at DevOpsDays NYC 2013.
The document discusses PGP (Pretty Good Privacy) and how it can be used to securely communicate and store secrets. It explains that PGP uses public-key cryptography to provide confidentiality, integrity, and authenticity. It also discusses how to generate a PGP key pair, and the importance of revoking keys if they are compromised or the user no longer needs them.
A talk on how system engineers and administrators, the people who maintain the infrastructure of the internet and who write a lot of code without (usually) having any training in software engineering practices, can improve their tools. Originally given at NYCBug in June 2009.
A presentation on how changes in Daylight Saving Time were handled at Yahoo!. Originally given at BayLISA in May 2007. Slides are available here:
netmeister.org/misc/dst_yahoo.pdf
Dandelion Hashtable: beyond billion requests per second on a commodity serverAntonios Katsarakis
This slide deck presents DLHT, a concurrent in-memory hashtable. Despite efforts to optimize hashtables, that go as far as sacrificing core functionality, state-of-the-art designs still incur multiple memory accesses per request and block request processing in three cases. First, most hashtables block while waiting for data to be retrieved from memory. Second, open-addressing designs, which represent the current state-of-the-art, either cannot free index slots on deletes or must block all requests to do so. Third, index resizes block every request until all objects are copied to the new index. Defying folklore wisdom, DLHT forgoes open-addressing and adopts a fully-featured and memory-aware closed-addressing design based on bounded cache-line-chaining. This design offers lock-free index operations and deletes that free slots instantly, (2) completes most requests with a single memory access, (3) utilizes software prefetching to hide memory latencies, and (4) employs a novel non-blocking and parallel resizing. In a commodity server and a memory-resident workload, DLHT surpasses 1.6B requests per second and provides 3.5x (12x) the throughput of the state-of-the-art closed-addressing (open-addressing) resizable hashtable on Gets (Deletes).
Must Know Postgres Extension for DBA and Developer during MigrationMydbops
Mydbops Opensource Database Meetup 16
Topic: Must-Know PostgreSQL Extensions for Developers and DBAs During Migration
Speaker: Deepak Mahto, Founder of DataCloudGaze Consulting
Date & Time: 8th June | 10 AM - 1 PM IST
Venue: Bangalore International Centre, Bangalore
Abstract: Discover how PostgreSQL extensions can be your secret weapon! This talk explores how key extensions enhance database capabilities and streamline the migration process for users moving from other relational databases like Oracle.
Key Takeaways:
* Learn about crucial extensions like oracle_fdw, pgtt, and pg_audit that ease migration complexities.
* Gain valuable strategies for implementing these extensions in PostgreSQL to achieve license freedom.
* Discover how these key extensions can empower both developers and DBAs during the migration process.
* Don't miss this chance to gain practical knowledge from an industry expert and stay updated on the latest open-source database trends.
Mydbops Managed Services specializes in taking the pain out of database management while optimizing performance. Since 2015, we have been providing top-notch support and assistance for the top three open-source databases: MySQL, MongoDB, and PostgreSQL.
Our team offers a wide range of services, including assistance, support, consulting, 24/7 operations, and expertise in all relevant technologies. We help organizations improve their database's performance, scalability, efficiency, and availability.
Contact us: info@mydbops.com
Visit: https://www.mydbops.com/
Follow us on LinkedIn: https://in.linkedin.com/company/mydbops
For more details and updates, please follow up the below links.
Meetup Page : https://www.meetup.com/mydbops-databa...
Twitter: https://twitter.com/mydbopsofficial
Blogs: https://www.mydbops.com/blog/
Facebook(Meta): https://www.facebook.com/mydbops/
"Scaling RAG Applications to serve millions of users", Kevin GoedeckeFwdays
How we managed to grow and scale a RAG application from zero to thousands of users in 7 months. Lessons from technical challenges around managing high load for LLMs, RAGs and Vector databases.
How information systems are built or acquired puts information, which is what they should be about, in a secondary place. Our language adapted accordingly, and we no longer talk about information systems but applications. Applications evolved in a way to break data into diverse fragments, tightly coupled with applications and expensive to integrate. The result is technical debt, which is re-paid by taking even bigger "loans", resulting in an ever-increasing technical debt. Software engineering and procurement practices work in sync with market forces to maintain this trend. This talk demonstrates how natural this situation is. The question is: can something be done to reverse the trend?
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...Fwdays
Direct losses from downtime in 1 minute = $5-$10 thousand dollars. Reputation is priceless.
As part of the talk, we will consider the architectural strategies necessary for the development of highly loaded fintech solutions. We will focus on using queues and streaming to efficiently work and manage large amounts of data in real-time and to minimize latency.
We will focus special attention on the architectural patterns used in the design of the fintech system, microservices and event-driven architecture, which ensure scalability, fault tolerance, and consistency of the entire system.
Essentials of Automations: Exploring Attributes & Automation ParametersSafe Software
Building automations in FME Flow can save time, money, and help businesses scale by eliminating data silos and providing data to stakeholders in real-time. One essential component to orchestrating complex automations is the use of attributes & automation parameters (both formerly known as “keys”). In fact, it’s unlikely you’ll ever build an Automation without using these components, but what exactly are they?
Attributes & automation parameters enable the automation author to pass data values from one automation component to the next. During this webinar, our FME Flow Specialists will cover leveraging the three types of these output attributes & parameters in FME Flow: Event, Custom, and Automation. As a bonus, they’ll also be making use of the Split-Merge Block functionality.
You’ll leave this webinar with a better understanding of how to maximize the potential of automations by making use of attributes & automation parameters, with the ultimate goal of setting your enterprise integration workflows up on autopilot.
Primum non nocere - Ethical Obligations in Internet OperationsJan Schaumann
The document discusses ethical obligations in internet operations and data stewardship. It notes that companies are stewards of users' data and are obligated to act in the public interest. Various codes of ethics from different organizations emphasize prioritizing public safety, health and welfare.
Safely Drinking from the Data WaterhoseJan Schaumann
An ingite talk given at DataGotham 2012 about how we extract security related events and alerts from our logs. I repeated the same talk at DevOpsDays NYC 2013.
The document discusses PGP (Pretty Good Privacy) and how it can be used to securely communicate and store secrets. It explains that PGP uses public-key cryptography to provide confidentiality, integrity, and authenticity. It also discusses how to generate a PGP key pair, and the importance of revoking keys if they are compromised or the user no longer needs them.
A talk on how system engineers and administrators, the people who maintain the infrastructure of the internet and who write a lot of code without (usually) having any training in software engineering practices, can improve their tools. Originally given at NYCBug in June 2009.
A presentation on how changes in Daylight Saving Time were handled at Yahoo!. Originally given at BayLISA in May 2007. Slides are available here:
netmeister.org/misc/dst_yahoo.pdf
Dandelion Hashtable: beyond billion requests per second on a commodity serverAntonios Katsarakis
This slide deck presents DLHT, a concurrent in-memory hashtable. Despite efforts to optimize hashtables, that go as far as sacrificing core functionality, state-of-the-art designs still incur multiple memory accesses per request and block request processing in three cases. First, most hashtables block while waiting for data to be retrieved from memory. Second, open-addressing designs, which represent the current state-of-the-art, either cannot free index slots on deletes or must block all requests to do so. Third, index resizes block every request until all objects are copied to the new index. Defying folklore wisdom, DLHT forgoes open-addressing and adopts a fully-featured and memory-aware closed-addressing design based on bounded cache-line-chaining. This design offers lock-free index operations and deletes that free slots instantly, (2) completes most requests with a single memory access, (3) utilizes software prefetching to hide memory latencies, and (4) employs a novel non-blocking and parallel resizing. In a commodity server and a memory-resident workload, DLHT surpasses 1.6B requests per second and provides 3.5x (12x) the throughput of the state-of-the-art closed-addressing (open-addressing) resizable hashtable on Gets (Deletes).
Must Know Postgres Extension for DBA and Developer during MigrationMydbops
Mydbops Opensource Database Meetup 16
Topic: Must-Know PostgreSQL Extensions for Developers and DBAs During Migration
Speaker: Deepak Mahto, Founder of DataCloudGaze Consulting
Date & Time: 8th June | 10 AM - 1 PM IST
Venue: Bangalore International Centre, Bangalore
Abstract: Discover how PostgreSQL extensions can be your secret weapon! This talk explores how key extensions enhance database capabilities and streamline the migration process for users moving from other relational databases like Oracle.
Key Takeaways:
* Learn about crucial extensions like oracle_fdw, pgtt, and pg_audit that ease migration complexities.
* Gain valuable strategies for implementing these extensions in PostgreSQL to achieve license freedom.
* Discover how these key extensions can empower both developers and DBAs during the migration process.
* Don't miss this chance to gain practical knowledge from an industry expert and stay updated on the latest open-source database trends.
Mydbops Managed Services specializes in taking the pain out of database management while optimizing performance. Since 2015, we have been providing top-notch support and assistance for the top three open-source databases: MySQL, MongoDB, and PostgreSQL.
Our team offers a wide range of services, including assistance, support, consulting, 24/7 operations, and expertise in all relevant technologies. We help organizations improve their database's performance, scalability, efficiency, and availability.
Contact us: info@mydbops.com
Visit: https://www.mydbops.com/
Follow us on LinkedIn: https://in.linkedin.com/company/mydbops
For more details and updates, please follow up the below links.
Meetup Page : https://www.meetup.com/mydbops-databa...
Twitter: https://twitter.com/mydbopsofficial
Blogs: https://www.mydbops.com/blog/
Facebook(Meta): https://www.facebook.com/mydbops/
"Scaling RAG Applications to serve millions of users", Kevin GoedeckeFwdays
How we managed to grow and scale a RAG application from zero to thousands of users in 7 months. Lessons from technical challenges around managing high load for LLMs, RAGs and Vector databases.
How information systems are built or acquired puts information, which is what they should be about, in a secondary place. Our language adapted accordingly, and we no longer talk about information systems but applications. Applications evolved in a way to break data into diverse fragments, tightly coupled with applications and expensive to integrate. The result is technical debt, which is re-paid by taking even bigger "loans", resulting in an ever-increasing technical debt. Software engineering and procurement practices work in sync with market forces to maintain this trend. This talk demonstrates how natural this situation is. The question is: can something be done to reverse the trend?
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...Fwdays
Direct losses from downtime in 1 minute = $5-$10 thousand dollars. Reputation is priceless.
As part of the talk, we will consider the architectural strategies necessary for the development of highly loaded fintech solutions. We will focus on using queues and streaming to efficiently work and manage large amounts of data in real-time and to minimize latency.
We will focus special attention on the architectural patterns used in the design of the fintech system, microservices and event-driven architecture, which ensure scalability, fault tolerance, and consistency of the entire system.
Essentials of Automations: Exploring Attributes & Automation ParametersSafe Software
Building automations in FME Flow can save time, money, and help businesses scale by eliminating data silos and providing data to stakeholders in real-time. One essential component to orchestrating complex automations is the use of attributes & automation parameters (both formerly known as “keys”). In fact, it’s unlikely you’ll ever build an Automation without using these components, but what exactly are they?
Attributes & automation parameters enable the automation author to pass data values from one automation component to the next. During this webinar, our FME Flow Specialists will cover leveraging the three types of these output attributes & parameters in FME Flow: Event, Custom, and Automation. As a bonus, they’ll also be making use of the Split-Merge Block functionality.
You’ll leave this webinar with a better understanding of how to maximize the potential of automations by making use of attributes & automation parameters, with the ultimate goal of setting your enterprise integration workflows up on autopilot.
Introduction of Cybersecurity with OSS at Code Europe 2024Hiroshi SHIBATA
I develop the Ruby programming language, RubyGems, and Bundler, which are package managers for Ruby. Today, I will introduce how to enhance the security of your application using open-source software (OSS) examples from Ruby and RubyGems.
The first topic is CVE (Common Vulnerabilities and Exposures). I have published CVEs many times. But what exactly is a CVE? I'll provide a basic understanding of CVEs and explain how to detect and handle vulnerabilities in OSS.
Next, let's discuss package managers. Package managers play a critical role in the OSS ecosystem. I'll explain how to manage library dependencies in your application.
I'll share insights into how the Ruby and RubyGems core team works to keep our ecosystem safe. By the end of this talk, you'll have a better understanding of how to safeguard your code.
5th LF Energy Power Grid Model Meet-up SlidesDanBrown980551
5th Power Grid Model Meet-up
It is with great pleasure that we extend to you an invitation to the 5th Power Grid Model Meet-up, scheduled for 6th June 2024. This event will adopt a hybrid format, allowing participants to join us either through an online Mircosoft Teams session or in person at TU/e located at Den Dolech 2, Eindhoven, Netherlands. The meet-up will be hosted by Eindhoven University of Technology (TU/e), a research university specializing in engineering science & technology.
Power Grid Model
The global energy transition is placing new and unprecedented demands on Distribution System Operators (DSOs). Alongside upgrades to grid capacity, processes such as digitization, capacity optimization, and congestion management are becoming vital for delivering reliable services.
Power Grid Model is an open source project from Linux Foundation Energy and provides a calculation engine that is increasingly essential for DSOs. It offers a standards-based foundation enabling real-time power systems analysis, simulations of electrical power grids, and sophisticated what-if analysis. In addition, it enables in-depth studies and analysis of the electrical power grid’s behavior and performance. This comprehensive model incorporates essential factors such as power generation capacity, electrical losses, voltage levels, power flows, and system stability.
Power Grid Model is currently being applied in a wide variety of use cases, including grid planning, expansion, reliability, and congestion studies. It can also help in analyzing the impact of renewable energy integration, assessing the effects of disturbances or faults, and developing strategies for grid control and optimization.
What to expect
For the upcoming meetup we are organizing, we have an exciting lineup of activities planned:
-Insightful presentations covering two practical applications of the Power Grid Model.
-An update on the latest advancements in Power Grid -Model technology during the first and second quarters of 2024.
-An interactive brainstorming session to discuss and propose new feature requests.
-An opportunity to connect with fellow Power Grid Model enthusiasts and users.
In the realm of cybersecurity, offensive security practices act as a critical shield. By simulating real-world attacks in a controlled environment, these techniques expose vulnerabilities before malicious actors can exploit them. This proactive approach allows manufacturers to identify and fix weaknesses, significantly enhancing system security.
This presentation delves into the development of a system designed to mimic Galileo's Open Service signal using software-defined radio (SDR) technology. We'll begin with a foundational overview of both Global Navigation Satellite Systems (GNSS) and the intricacies of digital signal processing.
The presentation culminates in a live demonstration. We'll showcase the manipulation of Galileo's Open Service pilot signal, simulating an attack on various software and hardware systems. This practical demonstration serves to highlight the potential consequences of unaddressed vulnerabilities, emphasizing the importance of offensive security practices in safeguarding critical infrastructure.
Conversational agents, or chatbots, are increasingly used to access all sorts of services using natural language. While open-domain chatbots - like ChatGPT - can converse on any topic, task-oriented chatbots - the focus of this paper - are designed for specific tasks, like booking a flight, obtaining customer support, or setting an appointment. Like any other software, task-oriented chatbots need to be properly tested, usually by defining and executing test scenarios (i.e., sequences of user-chatbot interactions). However, there is currently a lack of methods to quantify the completeness and strength of such test scenarios, which can lead to low-quality tests, and hence to buggy chatbots.
To fill this gap, we propose adapting mutation testing (MuT) for task-oriented chatbots. To this end, we introduce a set of mutation operators that emulate faults in chatbot designs, an architecture that enables MuT on chatbots built using heterogeneous technologies, and a practical realisation as an Eclipse plugin. Moreover, we evaluate the applicability, effectiveness and efficiency of our approach on open-source chatbots, with promising results.
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor IvaniukFwdays
At this talk we will discuss DDoS protection tools and best practices, discuss network architectures and what AWS has to offer. Also, we will look into one of the largest DDoS attacks on Ukrainian infrastructure that happened in February 2022. We'll see, what techniques helped to keep the web resources available for Ukrainians and how AWS improved DDoS protection for all customers based on Ukraine experience
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
Useless use of *
1. Useless Use of * Slide 1
Useless Use of *
Jan Schaumann
jschauma@netmeister.org
PGP: 136D 027F DC29 8402 7B42 47D6 7C5B 64AF AF22 6A4C
Jan Schaumann SCALE5x
2. Useless Use of * Slide 2
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$
Jan Schaumann SCALE5x
3. Useless Use of * Slide 3
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
Jan Schaumann SCALE5x
4. Useless Use of * Slide 4
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
Jan Schaumann SCALE5x
5. Useless Use of * Slide 5
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
Jan Schaumann SCALE5x
6. Useless Use of * Slide 6
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
Jan Schaumann SCALE5x
7. Useless Use of * Slide 7
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
Jan Schaumann SCALE5x
8. Useless Use of * Slide 8
whoami
$ ME=$(id -un)
$ grep ${ME} /etc/passwd | cut -d: -f5
Jan Schaumann
$ groups ${ME}
netbsd sa yahoo
$
http://pipes.yahoo.com
Jan Schaumann SCALE5x
9. Useless Use of * Slide 9
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
10. Useless Use of * Slide 10
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
11. Useless Use of * Slide 11
Useless Use of... what?
Back in the day...
The Operator
Jan Schaumann SCALE5x
12. Useless Use of * Slide 12
Useless Use of... what?
Back in the day...
BOFH
Jan Schaumann SCALE5x
13. Useless Use of * Slide 13
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
14. Useless Use of * Slide 14
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
15. Useless Use of * Slide 15
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
16. Useless Use of * Slide 16
Useless Use of... what?
Back in the day...
Jan Schaumann SCALE5x
17. Useless Use of * Slide 17
Useless Use of... what?
comp.unix.shell
Jan Schaumann SCALE5x
18. Useless Use of * Slide 18
Useless Use of... what?
I have a bunch of text files that contain strings
containing /u. I no longer want them to contain
/u ex: /u/appl/ should be /appl/....
Should I use awk? sed? Help!
Jan Schaumann SCALE5x
19. Useless Use of * Slide 19
Useless Use of... what?
> I have a bunch of text files that contain strings
> containing /u. I no longer want them to contain
> /u ex: /u/appl/ should be /appl/....
>
> Should I use awk? sed? Help!
cat file | sed -e "s!/u/!/!"
Jan Schaumann SCALE5x
20. Useless Use of * Slide 20
Useless Use of Cat
Jan Schaumann SCALE5x
21. Useless Use of * Slide 21
Useful Use of Cat (?)
The obvious:
cat file | grep pattern
cat file | awk ’{ print $2; }’
Jan Schaumann SCALE5x
22. Useless Use of * Slide 22
Useless Use of Cat
The obvious:
cat file | grep pattern
cat file | awk ’{ print $2; }’
Jan Schaumann SCALE5x
23. Useless Use of * Slide 23
Useless Use of Cat
The obvious:
cat file | grep pattern
grep pattern file
cat file | awk ’{ print $2; }’
awk ’{ print $2; }’ < file
Jan Schaumann SCALE5x
24. Useless Use of * Slide 24
Useful Use of Cat (?)
cat file1 file2 file3 | wc -l
cat file1 file2 file3 | wc -w
Jan Schaumann SCALE5x
25. Useless Use of * Slide 25
Useless Use of Cat
cat file1 file2 file3 | wc -l
cat file1 file2 file3 | wc -w
Jan Schaumann SCALE5x
26. Useless Use of * Slide 26
Useless Use of Cat
cat file1 file2 file3 | wc -l
awk ’END { print NR }’ file1 file2 file3
cat file1 file2 file3 | wc -w
awk ’{w = w + NF} END { print w }’ file1 file2 file3
Jan Schaumann SCALE5x
27. Useless Use of * Slide 27
Useful Use of Cat (?)
cat file1 file2 file3 | grep pattern
if [ $(cat files | grep -c pattern) -gt 0 ]; then
Jan Schaumann SCALE5x
28. Useless Use of * Slide 28
Useless Use of Cat
cat file1 file2 file3 | grep pattern
if [ $(cat files | grep -c pattern) -gt 0 ]; then
Jan Schaumann SCALE5x
29. Useless Use of * Slide 29
Useless Use of Cat
cat file1 file2 file3 | grep pattern
grep -h pattern file1 file2 file3
if [ $(cat files | grep -c pattern) -gt 0 ]; then
Jan Schaumann SCALE5x
30. Useless Use of * Slide 30
Useless Use of Cat
cat file1 file2 file3 | grep pattern
grep -h pattern file1 file2 file3
awk ’/pattern/ { print }’ file1 file2 file3
if [ $(cat files | grep -c pattern) -gt 0 ]; then
Jan Schaumann SCALE5x
31. Useless Use of * Slide 31
Useless Use of Cat
cat file1 file2 file3 | grep pattern
grep -h pattern file1 file2 file3
awk ’/pattern/ { print }’ file1 file2 file3
if [ $(cat files | grep -c pattern) -gt 0 ]; then
if [ -n ”$(grep -l pattern files)” ]; then
Jan Schaumann SCALE5x
32. Useless Use of * Slide 32
Useless Use of Cat
cat file1 file2 file3 | grep pattern
grep -h pattern file1 file2 file3
awk ’/pattern/ { print }’ file1 file2 file3
if [ $(cat files | grep -c pattern) -gt 0 ]; then
if [ -n "$(grep -l pattern files)" ]; then
if grep pattern files >/dev/null 2>&1; then
Jan Schaumann SCALE5x
33. Useless Use of * Slide 33
Useful Use of Cat
concatenate and print files
Jan Schaumann SCALE5x
34. Useless Use of * Slide 34
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
Jan Schaumann SCALE5x
35. Useless Use of * Slide 35
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
feed file as input to another command in a particular order
Jan Schaumann SCALE5x
36. Useless Use of * Slide 36
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
feed file as input to another command in a particular order
{ echo $VAR1; cat file; cmd1; } | command
Jan Schaumann SCALE5x
37. Useless Use of * Slide 37
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
feed file as input to another command in a particular order
{ echo $VAR1; cat file; cmd1; } | command
use as a NOOP
Jan Schaumann SCALE5x
38. Useless Use of * Slide 38
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
feed file as input to another command in a particular order
{ echo $VAR1; cat file; cmd1; } | command
use as a NOOP
if condition; then
cmd1 | cmd2 | cmd3
else
cmd1 | cmd3
fi
Jan Schaumann SCALE5x
39. Useless Use of * Slide 39
Useful Use of Cat
concatenate and print files (D’oh!)
cat * > file
feed file as input to another command in a particular order
{ echo $VAR1; cat file; cmd1; } | command
use as a NOOP
if condition; then
filter=cmd2
else
filter=cat
fi
cmd1 | ${filter} | cmd3
Jan Schaumann SCALE5x
40. Useless Use of * Slide 40
Useful Use of Cat
CAT5
CAT6
Jan Schaumann SCALE5x
41. Useless Use of * Slide 41
Why bother?
Jan Schaumann SCALE5x
42. Useless Use of * Slide 42
Why bother?
$2.95
Jan Schaumann SCALE5x
43. Useless Use of * Slide 43
Why bother?
$5.90
Jan Schaumann SCALE5x
44. Useless Use of * Slide 44
Why bother?
$11.80
Jan Schaumann SCALE5x
45. Useless Use of * Slide 45
Why bother?
$23.60
Jan Schaumann SCALE5x
46. Useless Use of * Slide 46
Why bother?
Jan Schaumann SCALE5x
47. Useless Use of * Slide 47
Why bother?
$47.20
Jan Schaumann SCALE5x
48. Useless Use of * Slide 48
Why bother?
$94.4
Jan Schaumann SCALE5x
49. Useless Use of * Slide 49
Why bother?
Jan Schaumann SCALE5x
50. Useless Use of * Slide 50
Why bother?
Jan Schaumann SCALE5x
52. Useless Use of * Slide 52
But...
... I run my scripts only once!
Jan Schaumann SCALE5x
53. Useless Use of * Slide 53
But...
... I have super fast hardware!
Jan Schaumann SCALE5x
54. Useless Use of * Slide 54
But...
... I have super fast hardware!
$ uptime
10:36AM up 254 days, 4 users, load averages: 80.12, 75.51, 72.40
$
Jan Schaumann SCALE5x
55. Useless Use of * Slide 55
But...
... nobody else but me uses my code!
Jan Schaumann SCALE5x
56. Useless Use of * Slide 56
Oh, really?
Unfortunately, you really have no control over your code:
Jan Schaumann SCALE5x
57. Useless Use of * Slide 57
Oh, really?
Unfortunately, you really have no control over your code:
code grows
Jan Schaumann SCALE5x
58. Useless Use of * Slide 58
Oh, really?
Unfortunately, you really have no control over your code:
code grows
code is reused
Jan Schaumann SCALE5x
59. Useless Use of * Slide 59
Oh, really?
Unfortunately, you really have no control over your code:
code grows
code is reused
code moves with you
Jan Schaumann SCALE5x
60. Useless Use of * Slide 60
Oh, really?
Unfortunately, you really have no control over your code:
code grows
code is reused
code moves with you
code is left behind
Jan Schaumann SCALE5x
61. Useless Use of * Slide 61
Oh, really?
Unfortunately, you really have no control over your code:
code grows
code is reused
code moves with you
code is left behind
It’s alive!
Jan Schaumann SCALE5x
62. Useless Use of * Slide 62
Oh, really?
Jan Schaumann SCALE5x
63. Useless Use of * Slide 63
Oh, really?
Jan Schaumann SCALE5x
64. Useless Use of * Slide 64
Useless Use of *
Useless Use of Cat
Jan Schaumann SCALE5x
65. Useless Use of * Slide 65
Useless Use of *
Useless Use of *
Jan Schaumann SCALE5x
66. Useless Use of * Slide 66
Useless Use of Grep
Jan Schaumann SCALE5x
67. Useless Use of * Slide 67
Useless Use of Grep
Of course, all use of grep(1) is useless!
Jan Schaumann SCALE5x
68. Useless Use of * Slide 68
Useless Use of Grep
Of course, all use of grep(1) is useless!
echo g/RE/p | ed -s file
Jan Schaumann SCALE5x
69. Useless Use of * Slide 69
Useful Use of Grep (?)
host hostname | grep ’has address’ | awk ’{ print $NF }’
echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’
Jan Schaumann SCALE5x
70. Useless Use of * Slide 70
Useless Use of Grep
host hostname | grep ’has address’ | awk ’{ print $NF }’
echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’
Jan Schaumann SCALE5x
71. Useless Use of * Slide 71
Useless Use of Grep
host hostname | grep ’has address’ | awk ’{ print $NF }’
host hostname | awk ’/has address/ { print $NF }’
echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’
Jan Schaumann SCALE5x
72. Useless Use of * Slide 72
Useless Use of Grep
host hostname | grep ’has address’ | awk ’{ print $NF }’
host hostname | awk ’/has address/ { print $NF }’
echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’
echo ${string} | sed -ne ’/pattern/ s/foo/bar/p’
Jan Schaumann SCALE5x
73. Useless Use of * Slide 73
Useful Use of Grep (?)
grep pattern1 file ... | grep -v pattern2
grep pattern1 file | grep -v ^# | grep -v pattern2
Jan Schaumann SCALE5x
74. Useless Use of * Slide 74
Useless Use of Grep
grep pattern1 file ... | grep -v pattern2
grep pattern1 file | grep -v ^# | grep -v pattern2
Jan Schaumann SCALE5x
75. Useless Use of * Slide 75
Useless Use of Grep
grep pattern1 file ... | grep -v pattern2
awk ’/pattern1/ && !/pattern2/ { print }’ file ...
grep pattern1 file | grep -v ^# | grep -v pattern2
Jan Schaumann SCALE5x
76. Useless Use of * Slide 76
Useless Use of Grep
grep pattern1 file ... | grep -v pattern2
awk ’/pattern1/ && !/pattern2/ { print }’ file ...
grep pattern1 file | grep -v ^# | grep -v pattern2
awk ’/pattern1/ && !/(ˆ#)|(pattern2)/ { print }’ file
Jan Schaumann SCALE5x
77. Useless Use of * Slide 77
Useful Use of Sed (?)
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
ls ${p}
done
Jan Schaumann SCALE5x
78. Useless Use of * Slide 78
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
ls ${p}
done
Jan Schaumann SCALE5x
79. Useless Use of * Slide 79
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done
Jan Schaumann SCALE5x
80. Useless Use of * Slide 80
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Sed
Jan Schaumann SCALE5x
81. Useless Use of * Slide 81
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Mknod ?
Jan Schaumann SCALE5x
82. Useless Use of * Slide 82
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Groff ?
Jan Schaumann SCALE5x
83. Useless Use of * Slide 83
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Shlock ?
Jan Schaumann SCALE5x
84. Useless Use of * Slide 84
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Route ?
Jan Schaumann SCALE5x
85. Useless Use of * Slide 85
Useless Use of Sed
for p in $(echo ${PATH} | sed -e ’s/:/ /’); do
IFS=":"; for p in ${PATH}; do
ls ${p}
done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’
Dump ?
Jan Schaumann SCALE5x
86. Useless Use of * Slide 86
Useless Use of Sed
Jan Schaumann SCALE5x
87. Useless Use of * Slide 87
Useful Use of Sed (?)
VAR1="foo-bar-baz"
VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)
Jan Schaumann SCALE5x
88. Useless Use of * Slide 88
Useless Use of Sed
VAR1="foo-bar-baz"
VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)
Jan Schaumann SCALE5x
89. Useless Use of * Slide 89
Useless Use of Sed
VAR1="foo-bar-baz"
VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)
VAR2=${VAR1%-baz}
Jan Schaumann SCALE5x
90. Useless Use of * Slide 90
Useful Use of Sed (?)
Looping over values in a variable:
VAR1="foo-bar-baz"
for i in $(echo ${VAR1} | sed -e ’s/-/ /g’); do
the_needful $i
done
Jan Schaumann SCALE5x
91. Useless Use of * Slide 91
Useless Use of Sed
Looping over values in a variable:
VAR1="foo-bar-baz"
for i in $(echo ${VAR1} | sed -e ’s/-/ /g’); do
IFS=-
for i in ${VAR1}; do
the_needful $i
done
Jan Schaumann SCALE5x
92. Useless Use of * Slide 92
Useful Use of Sed (?)
Assigning variables:
VAR1="foo-bar-baz"
VAR_A=$(echo ${VAR} | sed -e ’s/-*//’)
VAR_B=$(echo ${VAR} | sed -e ’s/[^-]*-([^-]*)-.*/1/’)
VAR_C=$(echo ${VAR} | sed -e ’s/.*-//’)
Jan Schaumann SCALE5x
93. Useless Use of * Slide 93
Useless Use of Sed
Assigning variables:
VAR1="foo-bar-baz"
VAR A=$(echo ${VAR} | sed -e ’s/-*//’)
VAR B=$(echo ${VAR} | sed -e ’s/[^-]*-[ˆ−]-.*/1/’)
VAR C=$(echo ${VAR} | sed -e ’s/.*-//’)
IFS=-
set -- ${VAR1}
VAR_A="${1}"
VAR_B="${2}"
VAR_C="${3}"
Jan Schaumann SCALE5x
94. Useless Use of * Slide 94
Useless Use of ...
Dude, IFS + shell is Teh Roxor!!!1
Look, Ma: Reading a CSV with Shell Only!
IFS=","
while read -r field1 waste field3 field4 waste; do
echo "${field1}: ${field4} --> ${field3}"
done <file
Jan Schaumann SCALE5x
95. Useless Use of * Slide 95
Useless Use of Shell Only
$ cat >script.sh
IFS=","
while read -r waste field2 field3 waste; do
echo "${field1}: ${field4} --> ${field3}"
done <file
^D
$ wc -l file
111061 file
$ time sh script.sh >/dev/null
12.33s real 3.30s user 8.54s system
$
Jan Schaumann SCALE5x
96. Useless Use of * Slide 96
Useless Use of Shell Only
Awk to the rescue!
$ cat >script2.sh
awk -F"," ’{ print $1 ": " $4 " --> " $3 }’ <file
^D
$ time sh script2.sh >/dev/null
1.08s real 1.08s user 0.00s system
$
Jan Schaumann SCALE5x
97. Useless Use of * Slide 97
Useful Use of Ls (?)
for file in $(ls *pattern*); do
the_needful
done
Jan Schaumann SCALE5x
98. Useless Use of * Slide 98
Useless Use of Ls
for file in $(ls *pattern*); do
for file in *pattern*; do
the_needful
done
Jan Schaumann SCALE5x
99. Useless Use of * Slide 99
Useful Use of Wc (?)
VAR=$(cat file | wc -l | sed -e ’s/ *//g)’
Jan Schaumann SCALE5x
100. Useless Use of * Slide 100
Useful Use of Wc (?)
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
Jan Schaumann SCALE5x
101. Useless Use of * Slide 101
Useless Use of ... ?
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
Jan Schaumann SCALE5x
102. Useless Use of * Slide 102
Useless Use of ... ?
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
Jan Schaumann SCALE5x
103. Useless Use of * Slide 103
Useless Use of ... ?
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
VAR=$(awk ’END { print NR }’ file)
Jan Schaumann SCALE5x
104. Useless Use of * Slide 104
Useless Use of Sed
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
VAR=$(wc -l <file)
Jan Schaumann SCALE5x
105. Useless Use of * Slide 105
Useless Use of Sed
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
VAR=$(wc -l <file)
echo "${VAR}"
Jan Schaumann SCALE5x
106. Useless Use of * Slide 106
Useless Use of Sed
VAR=$(cat file | wc -l | sed -e ’s/ *//g’)
VAR=$(wc -l <file| sed -e ’s/ *//g)’
VAR=$(wc -l <file)
echo "${VAR}"
echo ${VAR}
Jan Schaumann SCALE5x
107. Useless Use of * Slide 107
Useful Use of Head (?)
command1 | head -1 | sed -e ’s/pattern/string/’
command1 | head -10 | sed -e ’s/pattern/string/’
Jan Schaumann SCALE5x
108. Useless Use of * Slide 108
Useless Use of Head
command1 | head -1 | sed -e ’s/pattern/string/’
command1 | sed -e ’s/pattern/string/;q’
command1 | head -10 | sed -e ’s/pattern/string/’
Jan Schaumann SCALE5x
109. Useless Use of * Slide 109
Useless Use of Head
command1 | head -1 | sed -e ’s/pattern/string/’
command1 | sed -e ’s/pattern/string/;q’
command1 | head -10 | sed -e ’s/pattern/string/’
command1 | awk ’{ if (NR <= 10) { print gensub("pattern","string",0); } }’
Jan Schaumann SCALE5x
110. Useless Use of * Slide 110
Useful Use of Tail (?)
command1 | tail -1 | sed -e ’s/pattern/string/’
Jan Schaumann SCALE5x
111. Useless Use of * Slide 111
Useless Use of Tail
command1 | tail -1 | sed -e ’s/pattern/string/’
command1 | awk ’END { print gensub("pattern","string",0); exit; }’
Jan Schaumann SCALE5x
112. Useless Use of * Slide 112
Useful Use of Tail (?)
command1 | tail -10 | sed -e ’s/pattern/string/’
Jan Schaumann SCALE5x
113. Useless Use of * Slide 113
Useful Use of Tail
command1 | tail -10 | sed -e ’s/pattern/string/’
Jan Schaumann SCALE5x
114. Useless Use of * Slide 114
Useful Use of Expr (?)
echo $(expr $i + $i)
Jan Schaumann SCALE5x
115. Useless Use of * Slide 115
Useless Use of Expr
echo $(expr $i + $i)
echo $(( $i + $i ))
Jan Schaumann SCALE5x
116. Useless Use of * Slide 116
Useless Use of Expr
echo $(expr $i + $i)
echo $(( $i + $i ))
echo $(( $i << 1 ))
This even lets you do binary manipulation (binary and, or, xor, not, leftshift, rightshift).
Jan Schaumann SCALE5x
117. Useless Use of * Slide 117
Useless Use of Expr
echo $(expr $i + $i)
echo $(( $i + $i ))
echo $(( $i << 1 ))
This even lets you do binary manipulation (binary and, or, xor, not, leftshift, rightshift).
$ x=5
$ y=12
$ x=$(( ${x} ^ ${y} ))
$ y=$(( ${x} ^ ${y} ))
$ x=$(( ${x} ^ ${y} ))
$ echo "x=${x}; y=${y}"
x=12; y=5
$
Jan Schaumann SCALE5x
118. Useless Use of * Slide 118
Most Egregiously Useless Use of Perl
perl -e "print "ynnn";" | cmd
Jan Schaumann SCALE5x
119. Useless Use of * Slide 119
Most Egregiously Useless Use of Perl
perl -e "print "ynnn";" | cmd
( echo y; echo n; ) | cmd
Jan Schaumann SCALE5x
120. Useless Use of * Slide 120
Most Egregiously Useless Use of Perl
perl -e "print "ynnn";" | cmd
( echo y; echo n; ) | cmd
{ echo y; echo n; } | cmd
printf "ynnn" | cmd
Jan Schaumann SCALE5x
121. Useless Use of * Slide 121
Shell Coding: Performance
avoid file I/O
avoid Useless Use of *:
use builtins when you can
avoid builtins when it makes sense
use the right tool for the job
avoid spawning subshells (+1 fork) or pipes (n+1 forks)
Jan Schaumann SCALE5x
122. Useless Use of * Slide 122
Shell Coding: Performance
avoid file I/O
avoid Useless Use of *:
use builtins when you can
avoid builtins when it makes sense
use the right tool for the job
avoid spawning subshells (+1 fork) or pipes (n+1 forks)
cut -f2 vs. awk ’{print $2}’
$ stat -f "%z %N" /usr/bin/awk /usr/bin/cut
133487 /usr/bin/awk
12590 /usr/bin/cut
$
Jan Schaumann SCALE5x
123. Useless Use of * Slide 123
Testing Shell Code
make your code modular
clearly define each function:
pre-conditions
valid input
post-conditions
prepare valid input and desired output of each function
prepare invalid input and desired output of each function
Jan Schaumann SCALE5x
124. Useless Use of * Slide 124
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
Jan Schaumann SCALE5x
125. Useless Use of * Slide 125
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
$ cat >script.sh
set -u
echo ${FOO}
echo "done"
^D
$ sh script.sh
script.sh: FOO: parameter not set
$ echo $?
2
$
Jan Schaumann SCALE5x
126. Useless Use of * Slide 126
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
$ cat >script.sh
set -e
ls /nowhere
echo "done"
^D
$ sh script.sh
ls: /nowhere: No such file or directory
$
Jan Schaumann SCALE5x
127. Useless Use of * Slide 127
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
$ cat >script.sh
set -e
if ! ls /nowhere; then
echo "ls failed"
fi
echo "done"
^D
$ sh script.sh
ls: /nowhere: No such file or directory
ls failed
done
$
Jan Schaumann SCALE5x
128. Useless Use of * Slide 128
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
$ cat >script.sh
readonly VAR="foo"
VAR="bar"
echo ${VAR}
^D
$ sh script.sh
script.sh: VAR: is read only
$
Jan Schaumann SCALE5x
129. Useless Use of * Slide 129
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
Jan Schaumann SCALE5x
130. Useless Use of * Slide 130
Shell Coding Style: local variables
$ cat s.sh
func () {
input="${1}"
# do something with ${input}
}
$ cat script.sh
. ./s.sh
input="var1 var2 var3"
for var in ${input}; do
func "${var}"
done
echo ${input}
$ sh script.sh
var3
$
Jan Schaumann SCALE5x
131. Useless Use of * Slide 131
Shell Coding Style: local variables
$ cat s.sh
func () {
local input="${1}"
# do something with ${input}
}
$ cat script.sh
. ./s.sh
input="var1 var2 var3"
for var in ${input}; do
func "${var}"
done
echo ${input}
$ sh script.sh
var1 var2 var3
$
Jan Schaumann SCALE5x
132. Useless Use of * Slide 132
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
Jan Schaumann SCALE5x
133. Useless Use of * Slide 133
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
Bad:
# this adds 1 to num
num=$(( ${num} + 1 ))
Jan Schaumann SCALE5x
134. Useless Use of * Slide 134
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
Better:
input="pair1l:pair1r pair2l:pair2r"
# extract first pair in input string, throw away rest
p1l=${input%%:*}
rest=${input#*:}
p1r=${rest% *}
Jan Schaumann SCALE5x
135. Useless Use of * Slide 135
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
write your code in a modular way
Jan Schaumann SCALE5x
136. Useless Use of * Slide 136
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
write your code in a modular way
write test cases for your shell code
Jan Schaumann SCALE5x
137. Useless Use of * Slide 137
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
write your code in a modular way
write test cases for your shell code
be consistent in your style
Jan Schaumann SCALE5x
138. Useless Use of * Slide 138
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
write your code in a modular way
write test cases for your shell code
be consistent in your style
be consistent in your user interface
Jan Schaumann SCALE5x
139. Useless Use of * Slide 139
Shell Coding Style
Writing Shell Code is just like writing any other code:
set -eu (perl-mongers: think -w and use strict;)
use readonly variables
use local variables
comment your code
write your code in a modular way
write test cases for your shell code
be consistent in your style
be consistent in your user interface
be willing to sacrifice performance for readability
Jan Schaumann SCALE5x
140. Useless Use of * Slide 140
Shell Coding: Performance vs. Readability
awk -F: -v ME="${ME}" ’{ if ($0 ~ ME) { print $5 }}’ file
vs.
grep ${ME} file | cut -d: -f5
awk ’{w = w + NF} END { print w }’ file1 file2 file3
vs.
cat file1 file2 file2 | wc -w
Jan Schaumann SCALE5x
141. Useless Use of * Slide 141
The KISS Principle
Keep It Simple, Stupid!
Jan Schaumann SCALE5x
142. Useless Use of * Slide 142
Useless Use of time (?)
Thanks!
Jan Schaumann SCALE5x