criz
criz

Reputation: 273

Would it be possible to print the file used to redirect STDERR?

Would it be possible to print the filename used to redirect STDERR, given the sample command below:

command.sh 2>file.err

Code in command.sh:

#!/bin/sh
ls -l non_existing_file.txt
echo "STDERR file is: $stderrFilename" # variable should print file.err

Upvotes: 2

Views: 73

Answers (2)

criz
criz

Reputation: 273

I made a solution using history. Not sure if there is an easier way to do this ( or a proper one).

#!/bin/sh
stderrfname=`history | tail -1 | awk '{ print $3 }' | sed "s/.*>//"`
echo "STDERR file is: $stderrfname"

Upvotes: 1

Jeff Schaller
Jeff Schaller

Reputation: 2557

It's a little risky, but you could try parsing AIX's procfiles output. It involves capturing the major and minor numbers of the stderr device, along with the inode number, then looking for the corresponding device, its mountpoint, and then using find to look for the file with the given inode number:

#!/bin/sh
dev=$(procfiles $$ | awk '$1 == "2:" { print substr($4, 5) }')
inode=$(procfiles $$ | awk '$1 == "2:" { print substr($5, 5) }')

major=${dev%%,*}
minor=${dev##*,}

if [ "$major}" -eq 0 ]
then
  echo I give up, the major number is zero
  exit 1
fi

for file in /dev/*
do
  [ -b "$file" ] || continue
  if istat "$file" | grep -q "^Major Device ${major}.*Minor Device ${minor}$"
  then
    break
  fi
done

fs=$(mount | awk '$1 == "'"${file}"'" { print $2 }')
stderrFilename=$(find "$fs" -inum "$inode")

Upvotes: 1

Related Questions