diff --git a/rustup-init.sh b/rustup-init.sh
index 995d5360ae..ecfc56aabd 100755
--- a/rustup-init.sh
+++ b/rustup-init.sh
@@ -27,6 +27,8 @@ set -u
 
 # If RUSTUP_UPDATE_ROOT is unset or empty, default it.
 RUSTUP_UPDATE_ROOT="${RUSTUP_UPDATE_ROOT:-https://static.rust-lang.org/rustup}"
+# Set quiet as a global for ease of use
+RUSTUP_QUIET=no
 
 # NOTICE: If you change anything here, please make the same changes in setup_mode.rs
 usage() {
@@ -114,6 +116,9 @@ main() {
                 usage
                 exit 0
                 ;;
+            --quiet)
+                RUSTUP_QUIET=yes
+                ;;
             *)
                 OPTIND=1
                 if [ "${arg%%--*}" = "" ]; then
@@ -121,12 +126,15 @@ main() {
                     # don't attempt to interpret it.
                     continue
                 fi
-                while getopts :hy sub_arg "$arg"; do
+                while getopts :hqy sub_arg "$arg"; do
                     case "$sub_arg" in
                         h)
                             usage
                             exit 0
                             ;;
+                        q)
+                            RUSTUP_QUIET=yes
+                            ;;
                         y)
                             # user wants to skip the prompt --
                             # we don't need /dev/tty
@@ -140,18 +148,14 @@ main() {
         esac
     done
 
-    if $_ansi_escapes_are_valid; then
-        printf "\33[1minfo:\33[0m downloading installer\n" 1>&2
-    else
-        printf '%s\n' 'info: downloading installer' 1>&2
-    fi
+    say 'downloading installer'
 
     ensure mkdir -p "$_dir"
     ensure downloader "$_url" "$_file" "$_arch"
     ensure chmod u+x "$_file"
     if [ ! -x "$_file" ]; then
-        printf '%s\n' "Cannot execute $_file (likely because of mounting /tmp as noexec)." 1>&2
-        printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./rustup-init${_ext}." 1>&2
+        err "Cannot execute $_file (likely because of mounting /tmp as noexec)." 
+        err "Please copy the file to a location where you can execute binaries and run ./rustup-init${_ext}." 
         exit 1
     fi
 
@@ -162,6 +166,7 @@ main() {
         # to explicitly connect /dev/tty to the installer's stdin.
         if [ ! -t 1 ]; then
             err "Unable to run interactively. Run with -y to accept defaults, --help for additional options"
+            exit 1;
         fi
 
         ignore "$_file" "$@" < /dev/tty
@@ -184,14 +189,14 @@ get_current_exe() {
     if test -L /proc/self/exe ; then
         _current_exe=/proc/self/exe
     else
-        printf '%s\n' "Warning: Unable to find /proc/self/exe. System architecture detection might be inaccurate." 1>&2
+        warn "Unable to find /proc/self/exe. System architecture detection might be inaccurate."
         if test -n "$SHELL" ; then
             _current_exe=$SHELL
         else
             need_cmd /bin/sh
             _current_exe=/bin/sh
         fi
-        printf '%s\n' "Warning: Falling back to $_current_exe." 1>&2
+        warn "Falling back to $_current_exe."
     fi
     echo "$_current_exe"
 }
@@ -213,6 +218,7 @@ get_bitness() {
         echo 64
     else
         err "unknown platform bitness"
+        exit 1;
     fi
 }
 
@@ -247,6 +253,7 @@ get_endianness() {
         echo "${cputype}${suffix_eb}"
     else
         err "unknown platform endianness"
+        exit 1
     fi
 }
 
@@ -294,19 +301,14 @@ ensure_loongarch_uapi() {
             return 0
             ;;
         234)
-            echo >&2
-            echo 'Your Linux kernel does not provide the ABI required by this Rust' >&2
-            echo 'distribution.  Please check with your OS provider for how to obtain a' >&2
-            echo 'compatible Rust package for your system.' >&2
-            echo >&2
+            err 'Your Linux kernel does not provide the ABI required by this Rust distribution.'
+            err 'Please check with your OS provider for how to obtain a compatible Rust package for your system.'
             exit 1
             ;;
         *)
-            echo "warn: Cannot determine current system's ABI flavor, continuing anyway." >&2
-            echo >&2
-            echo 'Note that the official Rust distribution only works with the upstream' >&2
-            echo 'kernel ABI.  Installation will fail if your running kernel happens to be' >&2
-            echo 'incompatible.' >&2
+            warn "Cannot determine current system's ABI flavor, continuing anyway."
+            warn 'Note that the official Rust distribution only works with the upstream kernel ABI.'
+            warn 'Installation will fail if your running kernel happens to be incompatible.'
             ;;
     esac
 }
@@ -410,6 +412,7 @@ get_architecture() {
 
         *)
             err "unrecognized OS type: $_ostype"
+            exit 1
             ;;
 
     esac
@@ -489,6 +492,7 @@ get_architecture() {
             ;;
         *)
             err "unknown CPU type: $_cputype"
+            exit 1
 
     esac
 
@@ -501,14 +505,10 @@ get_architecture() {
                 else {
                     # 32-bit executable for amd64 = x32
                     if is_host_amd64_elf "$_current_exe"; then {
-                         echo "This host is running an x32 userland; as it stands, x32 support is poor," 1>&2
-                         echo "and there isn't a native toolchain -- you will have to install" 1>&2
-                         echo "multiarch compatibility with i686 and/or amd64, then select one" 1>&2
-                         echo "by re-running this script with the RUSTUP_CPUTYPE environment variable" 1>&2
-                         echo "set to i686 or x86_64, respectively." 1>&2
-                         echo 1>&2
-                         echo "You will be able to add an x32 target after installation by running" 1>&2
-                         echo "  rustup target add x86_64-unknown-linux-gnux32" 1>&2
+                        err "This host is running an x32 userland, for which no native toolchain is provided."
+                        err "You will have to install multiarch compatibility with i686 or amd64."
+                        err "To do so, set the RUSTUP_CPUTYPE environment variable set to i686 or amd64 and re-run this script."
+                        err "You will be able to add an x32 target after installation by running \`rustup target add x86_64-unknown-linux-gnux32\`." 
                          exit 1
                     }; else
                         _cputype=i686
@@ -531,6 +531,7 @@ get_architecture() {
                 ;;
             riscv64gc)
                 err "riscv64 with 32-bit userland unsupported"
+                exit 1
                 ;;
         esac
     fi
@@ -551,18 +552,34 @@ get_architecture() {
     RETVAL="$_arch"
 }
 
+__print() {
+    if $_ansi_escapes_are_valid; then
+        printf '\33[1m%s:\33[0m %s\n' "$1" "$2" >&2
+    else
+        printf '%s: %s\n' "$1" "$2" >&2
+    fi
+}
+
+warn() {
+    __print 'warn' "$1" >&2
+}
+
 say() {
-    printf 'rustup: %s\n' "$1"
+    if [ "$RUSTUP_QUIET" = "no" ]; then
+        __print 'info' "$1" >&2
+    fi
 }
 
+# NOTE: you are required to exit yourself
+# we don't do it here because of multiline errors
 err() {
-    say "$1" >&2
-    exit 1
+    __print 'error' "$1" >&2
 }
 
 need_cmd() {
     if ! check_cmd "$1"; then
         err "need '$1' (command not found)"
+        exit 1
     fi
 }
 
@@ -571,14 +588,20 @@ check_cmd() {
 }
 
 assert_nz() {
-    if [ -z "$1" ]; then err "assert_nz $2"; fi
+    if [ -z "$1" ]; then 
+        err "assert_nz $2"
+        exit 1
+    fi
 }
 
 # Run a command that should never fail. If the command fails execution
 # will immediately terminate with an error showing the failing
 # command.
 ensure() {
-    if ! "$@"; then err "command failed: $*"; fi
+    if ! "$@"; then
+        err "command failed: $*"
+        exit 1
+    fi
 }
 
 # This is just for indicating that commands' results are being
@@ -618,9 +641,9 @@ downloader() {
             _err=$(curl $_retry --proto '=https' --tlsv1.2 --ciphers "$_ciphersuites" --silent --show-error --fail --location "$1" --output "$2" 2>&1)
             _status=$?
         else
-            echo "warn: Not enforcing strong cipher suites for TLS, this is potentially less secure"
+            warn "Not enforcing strong cipher suites for TLS, this is potentially less secure"
             if ! check_help_for "$3" curl --proto --tlsv1.2; then
-                echo "warn: Not enforcing TLS v1.2, this is potentially less secure"
+                warn "Not enforcing TLS v1.2, this is potentially less secure"
                 _err=$(curl $_retry --silent --show-error --fail --location "$1" --output "$2" 2>&1)
                 _status=$?
             else
@@ -629,15 +652,16 @@ downloader() {
             fi
         fi
         if [ -n "$_err" ]; then
-            echo "$_err" >&2
+            warn "$_err"
             if echo "$_err" | grep -q 404$; then
                 err "installer for platform '$3' not found, this may be unsupported"
+                exit 1
             fi
         fi
         return $_status
     elif [ "$_dld" = wget ]; then
         if [ "$(wget -V 2>&1|head -2|tail -1|cut -f1 -d" ")" = "BusyBox" ]; then
-            echo "warn: using the BusyBox version of wget.  Not enforcing strong cipher suites for TLS or TLS v1.2, this is potentially less secure"
+            warn "using the BusyBox version of wget.  Not enforcing strong cipher suites for TLS or TLS v1.2, this is potentially less secure"
             _err=$(wget "$1" -O "$2" 2>&1)
             _status=$?
         else
@@ -647,9 +671,9 @@ downloader() {
                 _err=$(wget --https-only --secure-protocol=TLSv1_2 --ciphers "$_ciphersuites" "$1" -O "$2" 2>&1)
                 _status=$?
             else
-                echo "warn: Not enforcing strong cipher suites for TLS, this is potentially less secure"
+                warn "Not enforcing strong cipher suites for TLS, this is potentially less secure"
                 if ! check_help_for "$3" wget --https-only --secure-protocol; then
-                    echo "warn: Not enforcing TLS v1.2, this is potentially less secure"
+                    warn "Not enforcing TLS v1.2, this is potentially less secure"
                     _err=$(wget "$1" -O "$2" 2>&1)
                     _status=$?
                 else
@@ -659,14 +683,16 @@ downloader() {
             fi
         fi
         if [ -n "$_err" ]; then
-            echo "$_err" >&2
+            warn "$_err"
             if echo "$_err" | grep -q ' 404 Not Found$'; then
                 err "installer for platform '$3' not found, this may be unsupported"
+                exit 1
             fi
         fi
         return $_status
     else
         err "Unknown downloader"   # should not reach here
+        exit 1
     fi
 }
 
@@ -696,7 +722,7 @@ check_help_for() {
                     # fail to find these options to force fallback
                     if [ "$(sw_vers -productVersion | cut -d. -f2)" -lt 13 ]; then
                         # Older than 10.13
-                        echo "warn: Detected macOS platform older than 10.13"
+                        warn "Detected macOS platform older than 10.13"
                         return 1
                     fi
                     ;;
@@ -705,8 +731,8 @@ check_help_for() {
                     ;;
                 *)
                     # Unknown product version, warn and continue
-                    echo "warn: Detected unknown macOS major version: $(sw_vers -productVersion)"
-                    echo "Warning TLS capabilities detection may fail"
+                    warn "Detected unknown macOS major version: $(sw_vers -productVersion)"
+                    warn "TLS capabilities detection may fail"
                     ;;
             esac
         fi
