Normally, fish shell processes commands like this:
1 && 3 (2)
This is perfectly useful and it mirrors the order of execution that I would want most of the time.
I was wondering if a different syntax exists to get a slightly different order of execution?
Sometimes I want this:
2 && 3 (1)
is that possible without using multiple lines ?
This is a trivial example:
cd ~ && cat (pwd | psub)
In this example I want to run pwd
first then run cd
and then run cat
CodePudding user response:
oh! This seems to work:
cat (pwd | psub && cd ~)
kinda weird but if no one has a better answer I will use this syntax
CodePudding user response:
This is one of those cases where I'm going to recommend just using multiple lines [0].
It's cleaner and clearer:
set -l dir (pwd)
cd ~ && cat (printf '%s\n' $dir | psub)
This is completely ordinary and straightforward, and that's a good thing. It's also easily extensible - want to run the cd
only if the pwd
succeded?
set -l dir (pwd)
and cd ~ && cat (printf '%s\n' $dir | psub)
as set
passes on the previous $status, so here it passes on the status of pwd
.
The underlying philosophy here is that fish script isn't built for code golf. It doesn't have many shortcuts, even ones that posix shell script or especially shells like bash and zsh have. The fish way is to simply write the code.
Your answer of
cat (pwd | psub && cd ~)
doesn't work because that way the cat
is no longer only executed if the cd
succeeds - command substitutions can fail. Instead the cd
is now only done if the psub
succeeded - notably this also happens if pwd
fails.
(of course that cat (pwd | psub)
is fairly meaningless and could just be pwd
, I'm assuming you have some actual code you want to run like this)
[0]: Technically this doesn't have to be multiple lines, you can write it as set -l dir (pwd); cd ~ && cat (printf '%s\n' $dir | psub)
. I would, however, also recommend using multiple lines