na maioria das vezes você não precisa se preocupar com coisas como:
if [ -e "$file" ]
then echo exists
else echo not exists
fi
quando as pessoas fazem esse tipo de coisa, elas estão apenas girando as rodas. também pode ser problemático, pois há pouco para se conectar entre o comportamento e o formato de saída de um script em relação ao outro. e todo esforço é desperdiçado de qualquer maneira porque:
sh -c 'exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file
um shell POSIX com script morre com causa gravada em stderr quando um shell especial embutido é o objeto de qualquer redirecionamento de shell com falha. os builtins especiais são:
: continue break exec set . shift unset
times trap exit export readonly eval return
seu status especial pode ser rebaixado chamando-os via command
:
sh -c 'command exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file
can i?
e, portanto, a estratégia mais direta e eficaz para lidar de maneira robusta com arquivos de leitura / gravação é colocar o arquivo diretamente no descritor de arquivo com o qual você pretende interagir e deixar o shell manipular qualquer saída de erro como necessário. isso só acontecerá se for necessário e se você escrever seus scripts com um olho para permitir que as ações falem por si mesmos.
sh -c '
cat_fname()
for f
do exec <"$f"
printf "\n%-5s%-$((${#f}+2))s%s\n" === "$f" ===
cat
done
cat_fname a[1-9]/a[1-9].txt not_exist /dev/fd/0'
=== a1/a1.txt ===
1 1 1 11 1 1 1 1
=== a2/a2.txt ===
2 2 2 12 2 2 2 2
=== a3/a3.txt ===
3 3 3 13 3 3 3 3
=== a4/a4.txt ===
4 4 4 14 4 4 4 4
=== a5/a5.txt ===
5 5 5 15 5 5 5 5
=== a6/a6.txt ===
6 6 6 16 6 6 6 6
=== a7/a7.txt ===
7 7 7 17 7 7 7 7
=== a8/a8.txt ===
8 8 8 18 8 8 8 8
=== a9/a9.txt ===
9 9 9 19 9 9 9 9
sh: 4: cannot open not_exist: No such file