STDINのテキストをファイルの先頭に追加する方法

STDINのテキストをファイルの先頭に追加する方法

ある種の問題をデバッグしようとしています。ニックスDebianベースのオペレーティングシステムのLinuxインストーラスクリプト

言ったようにここ、このスニペットは次のとおりです/etc/bash.bashrc

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

一部のNixコマンドは非対話型シェルで実行されるため、コードスニペットの前にインポートする必要があるため、一部のNixコマンドは無効になります。

たとえば、このコマンドを考えましたが、1つの例外を除いてうまくいきます。

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

たとえば、次のものがfile.txt含まれている場合(行番号は説明のためのものであり、ファイルの内容の一部ではありません)

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"

メモ:

  • 入力が空であることを確認しません(stdinで)。空の場合、ファイルの先頭にスペース/スペースを追加するためです。

  • また、いかなる種類の処理エラーも発生しない。したがって、それを使用するすべてのファイルをバックアップするか、より安全な方法を使用してください。

引用:ファイルの先頭に行/テキストを追加する方法

関連情報