L'utilisateur appelle mon script avec un chemin de fichier qui sera soit créé soit écrasé à un moment donné du script, comme foo.sh file.txt
ou foo.sh dir/file.txt
.
Le comportement de création ou d'écrasement ressemble beaucoup aux exigences pour placer le fichier du côté droit de l' >
opérateur de redirection de sortie, ou le passer comme argument à tee
(en fait, le passer comme argument à tee
est exactement ce que je fais) ).
Avant d'entrer dans les tripes du script, je veux vérifier raisonnablement si le fichier peut être créé / écrasé, mais pas réellement le créer. Cette vérification ne doit pas être parfaite, et oui je me rends compte que la situation peut changer entre la vérification et le point où le fichier est réellement écrit - mais ici, je suis OK avec une solution de type meilleur effort afin que je puisse renflouer tôt dans le cas où le chemin du fichier n'est pas valide.
Exemples de raisons pour lesquelles le fichier n'a pas pu être créé:
- le fichier contient un composant de répertoire, comme
dir/file.txt
mais le répertoiredir
n'existe pas - l'utilisateur n'a pas d'autorisations d'écriture dans le répertoire spécifié (ou le CWD si aucun répertoire n'a été spécifié
Oui, je me rends compte que la vérification des autorisations "à l'avance" n'est pas The UNIX Way ™ , je devrais plutôt essayer l'opération et demander pardon plus tard. Cependant, dans mon script particulier, cela conduit à une mauvaise expérience utilisateur et je ne peux pas changer le composant responsable.
/foo/bar/file.txt
. Fondamentalement, je passe le chemin pour tee
aimer tee $OUT_FILE
où OUT_FILE
est passé sur la ligne de commande. Cela devrait "simplement fonctionner" avec des chemins absolus et relatifs, non?
tee -- "$OUT_FILE"
au moins. Que faire si le fichier existe déjà ou existe mais n'est pas un fichier normal (répertoire, lien symbolique, fifo)?
tee "${OUT_FILE}.tmp"
. Si le fichier existe déjà, tee
écrase, ce qui est le comportement souhaité dans ce cas. Si c'est un répertoire, tee
échouera (je pense). lien symbolique Je ne suis pas sûr à 100%?