我正在努力调试某种问题尼克斯基于 Debian 的操作系统上的 Linux 安装程序脚本
就像所说的那样这里,这个片段/etc/bash.bashrc
:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
会使一些 Nix 命令无效,因为有些命令在非交互式 shell 中运行,因此需要在该片段之前获取它
我想出了该命令作为示例,它在出现单个异常时运行得很好
sudo sed -i '1i source /etc/profile.d/nix.sh' /etc/bash.bashrc
在Nix脚本中,init函数已经由函数提供shell_source_lines()
,并通过管道传输到configure_shell_profile()
函数的tee -a
命令,因此它正在附加文件,我需要它附加开头,同时保持管道
shell_source_lines() {
cat <<EOF
# Nix
if [ -e '$PROFILE_NIX_FILE' ]; then
. '$PROFILE_NIX_FILE'
fi
# End Nix
EOF
}
configure_shell_profile() {
for profile_target in "${PROFILE_TARGETS[@]}"; do
if [ -e "$profile_target" ]; then
_sudo "to back up your current $profile_target to $profile_target$PROFILE_BACKUP_SUFFIX" \
cp "$profile_target" "$profile_target$PROFILE_BACKUP_SUFFIX"
else
# try to create the file if its directory exists
target_dir="$(dirname "$profile_target")"
if [ -d "$target_dir" ]; then
_sudo "to create a stub $profile_target which will be updated" \
touch "$profile_target"
fi
fi
# What I need to modify :
if [ -e "$profile_target" ]; then
shell_source_lines \
| _sudo "extend your $profile_target with nix-daemon settings" \
tee -a "$profile_target" # Needs to be replaced
fi
done
}
我找不到在文件前面添加 STDIN 文本的方法,有办法做到这一点吗?
答案1
将此命令替换为 GNU sed 版本。
tee -a "$profile_target"
sed -i -e '1r /dev/stdin' -e '1N' "$profile_target"
- 假设输入至少 2 行。
答案2
cat /dev/stdin file.txt
从 stdin 获取输入并将其写入 stdout,然后是file.txt
.
例如, if file.txt
contains (行号仅用于说明,不是文件内容的一部分)
1 This is some text in the
2 text file.
3 It has three lines.
然后
echo "Prepended text line" | cat /dev/stdin file.txt > combined.txt
结果文件combined.txt
包含
1 Prepended text line
2 This is some text in the
3 text file.
4 It has three lines.
答案3
在文件开头添加行并不像听起来那么容易,并且通常sed -i
在幕后使用临时文件(就像所做的那样)。
cat > data.new && mv data.new "$profile_target"
或者为了更快的解决方案,但这需要外部工具(sponge
来自moreutils
):
cat - "$profile_target" | sponge "$profile_target"
笔记:
这不会检查输入是否为空(来自标准输入),因为如果是,它将在文件开头添加空格/空白。
这也不会产生任何类型的处理错误。因此,请确保您对使用此文件的任何文件进行了备份,或者使用更安全的方法。