我正在编写一个函数,以附加到我的$HOME
目录中名为.bash.local
的文件中。
➡️.bash.local
来自.bash_profile
。
但是,我想有条件地附加到.bash.local
,并且仅当文件不已经包含$BASH_CONFIGS
的内容时。< / p>
我选择的操作系统是MacOS Mojave
,因此某些版本的命令行应用程序将有所不同(例如,Mac上的grep
是BSD grep
,而不是GNU grep
)。
append_to_bash_local() {
local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local
declare -r BASH_CONFIGS="
# TOOL_NAME - TOOL_DESCRIPTION.
# Add tool configurations here
"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# If needed, add the necessary configs in the
# local shell configuration file.
if ! grep "^$BASH_CONFIGS" < "$LOCAL_BASH_CONFIG_FILE" &> /dev/null; then
# this block never runs, even if the contents of $BASH_CONFIG
# are NOT present in $HOME/.bash.local
fi
}
答案 0 :(得分:1)
您很近。无论如何,小的修补程序:
grep -Z
将模式与换行符匹配。如果考虑到这一点,它可能有点笨拙,但每次都能使用。-q
进行grep使其静音。
append_to_bash_local() {
local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local
declare -r BASH_CONFIGS="
# TOOL_NAME - TOOL_DESCRIPTION.
# Add tool configurations here
"
if
# if a file does not exists
[ ! -e "$LOCAL_BASH_CONFIG_FILE" ] ||
# if it doesn't have the content of BASH_CONFIGS
! grep -q -z "$BASH_CONFIGS" "$LOCAL_BASH_CONFIG_FILE"; then
echo appending
echo "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
else
echo not appending
fi
}
答案 1 :(得分:0)
在@kamil-cuk的帮助下,我得以创建append_to_bash_local()
的改进版本。
⚠️请注意,由于我在MacOS Mojave
上并且默认情况下同时安装了BSD-grep
和BSD-sed
并且没有安装GNU-grep
和GNU-sed
,所以我被迫为使用ASCII NUL字符截断换行符寻找其他解决方案。幸运的是,@kamil-cuk使用了tr
的 hacky 解决方案。
下面是append_to_bash_local()
的改进版本。
append_to_bash_local()
[ ! -e "$LOCAL_BASH_CONFIG_FILE" ]
。-q
与grep
配合使用以使其保持静音。
!
的前面放置一个grep -q
(不要),以确保输出的状态反转,因为我们正在检查文件是否不包含< / em> $BASH_CONFIGS
的内容。最后,请使用"$(<<<"$BASH_CONFIGS" tr '\n' '\01')" < <(less "$LOCAL_BASH_CONFIG_FILE" | tr '\n' '\01')
,以便在$BASH_CONFIGS
和$LOCAL_BASH_CONFIG_FILE
中使用ASCII NUL字符截断换行字符。>
append_to_bash_local() {
local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local
declare -r BASH_CONFIGS="
# TOOL_NAME - TOOL_DESCRIPTION.
# Add tool configurations here
"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# If needed, add the necessary configs in the
# local shell configuration file.
if [ ! -e "$LOCAL_BASH_CONFIG_FILE" ] || ! grep -q "$(<<<"$BASH_CONFIGS" tr '\n' '\01')" < <(less "$LOCAL_BASH_CONFIG_FILE" | tr '\n' '\01'); then
printf '%s\n' "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
fi
}