On Thu, Dec 19, 2019 at 01:10:46AM +0100, Marcin Zajączkowski wrote: > Hi, > > Due to [1] I use "|| exit -2" to break script on a command execution > failure in my backup script. > > However, I also want to have output written to a file. The following > solution writes logs to a file, but silently ignores any failure in > "my-backup": > > my-backup 2>&1 | tee -a /tmp/some-log || exit -2 > > I tried to keep the error in a variable (to check its state later on and > fail), but it breaks output redirection at all: > > my-backup 2>&1 || set ERR2 -2 | tee -a /tmp/some-log || exit -3 > > Maybe keeping the first two commands in (logical) brackes would help, > but () are in Fish reserved for something else. > > Is it possible in Fish to have a construction that allows to: > 1. Run command and have output redirected (e.g. with "tee") also to a > file (at least) in a case of success. > 2. Break further commands execution in a case of failure (with "|| exit > -2" or anything else).
Logical brackets in fish are "begin" and "end", so you can use begin my-backup 2>&1 || exit -2 end | tee -a /tmp/some-log || exit -3 Fish 3.1.0 will have a $pipestatus variable, so you will be able to do this instead: my-backup 2>&1 | tee -a /tmp/some-log || exit -3 if test $pipestatus[1] -ne 0 exit -2 # my-backup failed end That being said, if you use `|| exit $status` a lot then it's probably easier to use a POSIX shell with for this (non-interactive) script. > > ? > > > [1] - https://github.com/fish-shell/fish-shell/issues/2389 > > Marcin > > -- > https://blog.solidsoft.info/ - Working code is not enough > > > _______________________________________________ > Fish-users mailing list > Fish-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/fish-users _______________________________________________ Fish-users mailing list Fish-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/fish-users