blob: 584f53c85f90f791ea2c0fc4ef76698424c5e599 [file] [log] [blame]
# No #!/bin/bash - See "usage"
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
### check the health of a user's interactive bash environment (from "fx doctor")
## usage:
## "${SHELL}" [-flags] "${FUCHSIA_DIR}/tools/devshell/lib/bashrc_checkup.sh" || status=$?
## (Valid only for bash ${SHELL} since this script is bash.)
# Detect potential problems for Fuchsia development from settings specific
# to the user's interactive shell environment. Potential customizations can
# include bash version and settings introduced in the user's ~/.bashrc file
# such as bash functions, aliases, and non-exported variables such as
# "${CDPATH}" and "${PATH}" that can impact how bash executes some commands
# from the command line.
#
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/vars.sh || exit $?
source "${FUCHSIA_DIR}/tools/devshell/lib/style.sh" || exit $?
source "${FUCHSIA_DIR}/tools/devshell/lib/common_term_styles.sh" || exit $?
fx-config-read || exit $?
# For bash users, this script also attempts to load your preferred
# bash interpreter (if different from the default, such as Homebrew
# bash on Mac), and load your ~/.bashrc settings, as would happen
# in an interactive shell. This allows doctor to check for
# potential issues with settings that don't normally propagate to
# bash scripts (unless executed with "source"), such as bash
# functions, aliases, and unexported variables.
# For bash users, load settings that would exist in the user's
# interactive bash shells as per
# [The GNU Bash Reference Manual, for Bash, Version 4.4](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
check_cd() {
# Returns an error status if the current definition of "cd"
# writes anything to the stdout stream, which would break common bash
# script lines similar to the following:
#
# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local cd_output=$(
CDPATH=""
cd "${FUCHSIA_DIR}" 2>/dev/null
cd scripts 2>/dev/null
)
local cdpath_output=$(
if [ -z "${cd_output}" ] && [ "${CDPATH}" != "" ]; then
CDPATH="${FUCHSIA_DIR}"
cd scripts 2>/dev/null
fi
)
if [ -z "${cdpath_output}" ] && [ -z "${cd_output}" ]; then
return 0 # The check passed!
fi
# The check failed. Print recommendations based on what we found.
local status=1
warn 'Your implementation of the "cd" command writes to stdout.'
details << EOF
Many common developer scripts and tools use "cd" to find relative
file paths and will fail in unpredictable ways.
EOF
if [ ! -z "${cdpath_output}" ]; then
details << EOF
The "cd" command writes to stdout based on your CDPATH environment variable.
You can remove or unset CDPATH in your shell initialization script, or
define a cd wrapper function.
EOF
fi
details << EOF
If you have not redefined "cd", and the builtin "cd" is writing to stdout,
define a wrapper function and redirect the output to /dev/null or stderr.
EOF
code << EOF
cd() {
builtin cd "\$@"
}
EOF
details << EOF
If you already redefine "cd" during shell initialization, find the alias,
function, or script, and either remove it, or redirect the output to stderr
by appending "", as in this example:
EOF
code << EOF
cd() {
builtin cd "\$@" >/dev/null
update_terminal_cwd
}
EOF
details << EOF
(Note, in this example, "update_terminal_cwd" is a common MacOS function
to call when changing directories. Other common "cd" overrides may invoke
"pwd", "print", or other commands.)
EOF
return ${status}
}
main() {
local status=0
check_cd || status=$?
return ${status}
}
main "$@" || exit $?