-n 효과
[ -n string ] 또는 [ string ] 문자열 길이가 0이 아닌 경우(내용이 있음) 참입니다. -n을 추가하면 -n을 추가하지 않는 것과 동일한 결과가 발생합니다.
-z 효과
[ -z string ] 문자열 길이가 0이면 참입니다. 위의 -n과 달리 문자열이 비어 있거나 NULL이면 참입니다.
-f 효과
[ -f FILE ] FILE이 존재하고 일반 파일이면 참입니다.
ros 시스템 환경은 ros2 foxy입니다.
시스템과 함께 제공되는 패키지 소스의 첫 번째 시스템 스크립트 파일
/opt/ros/foxy/setup.bash
# copied from ament_package/template/prefix_level/setup.bash
AMENT_SHELL=bash
# source setup.sh from same directory as this file
AMENT_CURRENT_PREFIX=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" && pwd)
# trace output
if [ -n "$AMENT_TRACE_SETUP_FILES" ]; then
echo "# . \"$AMENT_CURRENT_PREFIX/setup.sh\""
fi
. "$AMENT_CURRENT_PREFIX/setup.sh"
$AMENT_TRACE_SETUP_FILES에 내용이 없는지 터미널에 이 변수를 표시하여 확인합니다.
[ -n "$AMENT_TRACE_SETUP_FILES" ] 내용이 없습니다. if fi 의 코드는 실행되지 않고 실행을 위해 마지막 문장으로 직접 점프합니다.
. "$AMENT_CURRENT_PREFIX/setup.sh"
이 스크립트 파일의 의미는 동일한 폴더에 있는 setup.sh 파일을 실행하고 전송하여 다음 스크립트를 실행한다는 것입니다.
/opt/ros/foxy/setup.sh
# generated from ament_package/template/prefix_level/setup.sh.in
# since this file is sourced use either the provided AMENT_CURRENT_PREFIX
# or fall back to the destination set at configure time
: ${AMENT_CURRENT_PREFIX:=/opt/ros/foxy}
# set type of shell if not already set
: ${AMENT_SHELL:=sh}
# function to append non-duplicate values to environment variables
# using colons as separators and avoiding leading separators
ament_append_unique_value() {
# arguments
_listname=$1
_value=$2
#echo "listname $_listname"
#eval echo "list value \$$_listname"
#echo "value $_value"
# check if the list contains the value
eval _values=\$$_listname
_duplicate=
_ament_append_unique_value_IFS=$IFS
IFS=":"
if [ "$AMENT_SHELL" = "zsh" ]; then
ament_zsh_to_array _values
fi
for _item in $_values; do
# ignore empty strings
if [ -z "$_item" ]; then
continue
fi
if [ $_item = $_value ]; then
_duplicate=1
fi
done
unset _item
# append only non-duplicates
if [ -z "$_duplicate" ]; then
# avoid leading separator
if [ -z "$_values" ]; then
eval $_listname=\"$_value\"
#eval echo "set list \$$_listname"
else
# field separator must not be a colon
unset IFS
eval $_listname=\"\$$_listname:$_value\"
#eval echo "append list \$$_listname"
fi
fi
IFS=$_ament_append_unique_value_IFS
unset _ament_append_unique_value_IFS
unset _duplicate
unset _values
unset _value
unset _listname
}
# iterate over all parent_prefix_path files
_prefix_setup_IFS=$IFS
IFS="
"
# this variable contains the concatenated prefix paths in reverse order
_UNIQUE_PREFIX_PATH=""
# this check is used to skip parent prefix path in the Debian package
if [ -z "SKIP_PARENT_PREFIX_PATH" ]; then
# find parent prefix path files for all packages under the current prefix
_RESOURCES="$(\find "$AMENT_CURRENT_PREFIX/share/ament_index/resource_index/parent_prefix_path" -mindepth 1 -maxdepth 1 2> /dev/null | \sort)"
if [ "$AMENT_SHELL" = "zsh" ]; then
ament_zsh_to_array _RESOURCES
fi
for _resource in $_RESOURCES; do
# read the content of the parent_prefix_path file
_PARENT_PREFIX_PATH="$(\cat "$_resource")"
# reverse the list
_REVERSED_PARENT_PREFIX_PATH=""
IFS=":"
if [ "$AMENT_SHELL" = "zsh" ]; then
ament_zsh_to_array _PARENT_PREFIX_PATH
fi
for _path in $_PARENT_PREFIX_PATH; do
# replace placeholder of current prefix
if [ "$_path" = "{prefix}" ]; then
_path="$AMENT_CURRENT_PREFIX"
fi
# avoid leading separator
if [ -z "$_REVERSED_PARENT_PREFIX_PATH" ]; then
_REVERSED_PARENT_PREFIX_PATH=$_path
else
_REVERSED_PARENT_PREFIX_PATH=$_path:$_REVERSED_PARENT_PREFIX_PATH
fi
done
unset _PARENT_PREFIX_PATH
# collect all unique parent prefix path
if [ "$AMENT_SHELL" = "zsh" ]; then
ament_zsh_to_array _REVERSED_PARENT_PREFIX_PATH
fi
for _path in $_REVERSED_PARENT_PREFIX_PATH; do
ament_append_unique_value _UNIQUE_PREFIX_PATH "$_path"
done
unset _REVERSED_PARENT_PREFIX_PATH
done
unset _resource
unset _RESOURCES
fi
# append this directory to the prefix path
ament_append_unique_value _UNIQUE_PREFIX_PATH "$AMENT_CURRENT_PREFIX"
unset AMENT_CURRENT_PREFIX
# store AMENT_SHELL to restore it after each prefix
_prefix_setup_AMENT_SHELL=$AMENT_SHELL
# source local_setup.EXT or local_setup.sh file for each prefix path
IFS=":"
if [ "$AMENT_SHELL" = "zsh" ]; then
ament_zsh_to_array _UNIQUE_PREFIX_PATH
fi
for _path in $_UNIQUE_PREFIX_PATH; do
# trace output
if [ -n "$AMENT_TRACE_SETUP_FILES" ]; then
echo "# . \"$_path/local_setup.$AMENT_SHELL\""
fi
if [ -f "$_path/local_setup.$AMENT_SHELL" ]; then
if [ "$AMENT_SHELL" = "sh" ]; then
# provide AMENT_CURRENT_PREFIX to .sh files
AMENT_CURRENT_PREFIX=$_path
fi
# restore IFS before sourcing other files
IFS=$_prefix_setup_IFS
. "$_path/local_setup.$AMENT_SHELL"
# restore AMENT_SHELL after each prefix-level local_setup file
AMENT_SHELL=$_prefix_setup_AMENT_SHELL
fi
done
unset _path
IFS=$_prefix_setup_IFS
unset _prefix_setup_IFS
unset _prefix_setup_AMENT_SHELL
unset _UNIQUE_PREFIX_PATH
unset AMENT_SHELL
자체 생성된 패키지 소스 환경 변수 스크립트
작업공간 소스 install/setup.bash에서
# generated from colcon_bash/shell/template/prefix_chain.bash.em
# This script extends the environment with the environment of other prefix
# paths which were sourced when this file was generated as well as all packages
# contained in this prefix path.
# function to source another script with conditional trace output
# first argument: the path of the script
_colcon_prefix_chain_bash_source_script() {
if [ -f "$1" ]; then
if [ -n "$COLCON_TRACE" ]; then
echo ". \"$1\""
fi
. "$1"
else
echo "not found: \"$1\"" 1>&2
fi
}
# source chained prefixes
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="/opt/ros/foxy"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
# source this prefix
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
unset COLCON_CURRENT_PREFIX
unset _colcon_prefix_chain_bash_source_script
$0 현재 스크립트 이름 $1 스크립트의 첫 번째 매개변수
_colcon_prefix_chain_bash_source_script(){} 함수의 의미는 첫 번째 매개변수 파일이 있으면 첫 번째 매개변수를 실행하고, 없으면 오류를 보고한다는 것입니다.
따라서 우리 작업 공간에서 install/setup.bash를 소스로 지정하면 이는 동시에 /opt/ros/foxy/local_setup.bash 소스와 동일합니다.
소스 설치/local_setup.bash