User Tools

Site Tools


bash-script-stdio
no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


bash-script-stdio [2024/02/19 14:29] (current) – created dblume
Line 1: Line 1:
 +====== Bash Script Stdin and Stdout ======
  
 +
 +===== Reading from Stdin or Filename =====
 +
 +If you write a shell script and want it to run with either stdin or a filename, like so:
 +
 +    cat file.txt | script.sh
 +    script.sh file.txt
 +
 +There are some options. Here we'll use ''awk'' as the command inside the script.
 +
 +=== The General, Idiomatic Way ===
 +
 +The canonical way is to cat the args to the script.
 +
 +<file bash script.sh>
 +#!/usr/bin/env sh
 +cat "$@" | awk -F, '...'
 +</file>
 +
 +=== Shell Default Parameter Substitution ===
 +
 +Use Bash parameter substitution to try to pass in ''$1'', but if it doesn't exist, pass in ''/dev/stdin''.
 +
 +<file bash script.sh>
 +#!/usr/bin/env sh
 +awk -F, '...' "${1:-/dev/stdin}"
 +</file>
 +
 +=== Let the Command Handle It ===
 +
 +Since we're using ''awk'' as our example, and it already supports stdin or filenames, don't be a
 +bash script, be an awk script. (But in this case we can't use ''/usr/bin/env''.)
 +
 +<file bash script.awk>
 +#!/bin/awk -f
 +BEGIN{FS=","} ...
 +</file>
 +
 +===== Writing to Stdout and/or to file =====
 +
 +To just append script output to the file
 +
 +<file bash script.sh>
 +#!/usr/bin/env bash
 +set -euf -o pipefail
 +
 +# Just append stdout to the file
 +exec >>file.txt
 +
 +# (now the rest of your script)
 +</file>
 +
 +Or write output to stdout and append the same output to the file.
 +
 +<file bash script.sh>
 +#!/usr/bin/env bash
 +set -euf -o pipefail
 +
 +# Write to stdout and append to the file
 +exec > >(tee -a file.txt)
 +
 +# (now the rest of your script)
 +</file>
bash-script-stdio.txt · Last modified: 2024/02/19 14:29 by dblume