User Tools

Site Tools


bash-stdin-or-filename

This is an old revision of the document!


Bash Script 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.

script.sh
#!/usr/bin/env sh
cat "$@" | awk -F, '...'

Shell Default Parameter Substitution

Use Bash parameter substitution to try to pass in $1, but if it doesn't exist, pass in /dev/stdin.

script.sh
#!/usr/bin/env sh
awk -F, '...' "${1:-/dev/stdin}"

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.)

script.awk
#!/bin/awk -f
BEGIN{FS=","} ...
bash-stdin-or-filename.1706859040.txt.gz ยท Last modified: 2024/02/01 23:30 by dblume