2

I am trying to write a portable installation script for building the compiler for my programming language. You can see the script here:

mkdir ArithmeticExpressionCompiler cd ArithmeticExpressionCompiler if command -v wget &> /dev/null then wget https://flatassembler.github.io/Duktape.zip else curl -o Duktape.zip https://flatassembler.github.io/Duktape.zip fi unzip Duktape.zip if command -v gcc &> /dev/null then gcc -o aec aec.c duktape.c -lm # The linker that comes with recent versions of Debian Linux insists that "-lm" is put AFTER the source files, or else it outputs some confusing error message. else clang -o aec aec.c duktape.c -lm fi ./aec analogClock.aec if command -v gcc &> /dev/null then gcc -o analogClock analogClock.s -m32 else clang -o analogClock analogClock.s -m32 fi ./analogClock 

However, when I run it on FreeBSD, it complains that wget is not found. But the script checks whether wget exists before calling it. wget is not supposed to be called on FreeBSD. Now, I know FreeBSD uses sh rather than bash, and I suppose my script is not actually POSIX-compliant. So, what am I doing wrong?

1
  • 5
    Well you could Put a valid shebang and paste your script at shellcheck.net for validation/recommendation. That said &> is bashism Commented Jan 12, 2023 at 22:39

1 Answer 1

8

From the POSIX Spec:

If a command is terminated by the control operator ( '&' ), the shell shall execute the command asynchronously in a subshell. This means that the shell shall not wait for the command to finish before executing the next command.

In posix &> is not supported by posix instead it will see & as a background command indicator causing your command to be run asynchronously with the next part > /dev/null which is seen as a seperate command. This is basically if you were to run:

command -v wget & > /dev/null 

Instead you have to redirect another way:

command -v wget >/dev/null 2>&1 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.