Defina a opção noclobber
do shell:
bash-3.2$ set -o noclobber
bash-3.2$ echo hello >foo
bash-3.2$ echo hello >foo
bash: foo: cannot overwrite existing file
bash-3.2$
Recentemente estou ecoando frases curtas para um arquivo tree_hole
.
Eu estava usando echo 'something' >> tree_hole
para fazer este trabalho.
Mas sempre fiquei preocupado com o que acontece se eu inserir mal o >
em vez do >>
, já que fiz isso com frequência.
Então eu fiz um bash global func do meu próprio no bashrc:
function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th
Mas eu estou querendo saber se há outra maneira simples de acrescentar linhas ao final de um arquivo. Porque eu posso precisar usar isso muitas vezes em outras ocasiões.
Existe algum?
Se você está preocupado que seu arquivo será danificado pelo operador >
, você pode alterar seu atributo de arquivo apenas para acrescentar:
No sistema de arquivos ext2 / ext3 / ext4 : chattr +a file.txt
No sistema de arquivos XFS : echo chattr +a | xfs_io file.txt
E se você quiser uma função, eu já fiz uma função para mim (eu usei no arquivo de serviço para registrar as saídas), Você pode alterá-la para o seu propósito:
# This function redirect logs to file or terminal or both!
#@ USAGE: log option data
# To the file -f file
# To the terminal -t
function log(){
read -r data # Read data from pipe line
[[ -z ${indata} ]] && return 1 # Return 1 if data is null
# Log to /var/log/messages
logger -i -t SOFTWARE ${data}
# While loop for traveling on the arguments
while [[ ! -z "$*" ]]; do
case "$1" in
-t)
# Writting data to the terminal
printf "%s\n" "${data}"
;;
-f)
# Writting (appending) data to given log file address
fileadd=$2
printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd}
;;
*)
;;
esac
shift # Shifting arguments
done
}
Use tee
com a opção de acrescentar:
foo | tee -a some-file
# or
tee -a some-file <<EOF
blah blah
EOF
# or
tee -a some-file <<<"blah blah"
muitos programas que podem abrir arquivos para sobrescrever podem, alternativamente, abri-los para acrescentar, por exemplo, gnu dd.
dd conv=notrunc oflag=append of=file
ele pode ler stdin ou um arquivo chamado no parâmetro if=
add 2>/dev/null
para suprimir a contagem de bytes.
Eu gostaria de usar um sed
(mesmo com cópia de backup - veja extention após -i
):
sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole
Você sempre pode procurar pelo arquivo de outras maneiras ...
seq 10000000 >f
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
wc -l f; tail f
... impressões de sequências estranhas:
10000000
10000001
10000002
10000003
10000004
10000005 f
9999996
9999997
9999998
9999999
10000000
new line!
new line!
new line!
new line!
new line!
Mas isso é meio bobo.
Um exemplo mais útil poderia ser:
apnd() if shift
then wc -l >&2
printf "$@"
fi <>"$1" >&0
Você pode chamá-lo assim:
apnd /path/to/file \
"${printf_fmt_string}" \
arbitrary list of strings
E você acabaria com uma contagem das linhas de file
gravadas em stderr
antes que a ação de acréscimo tenha lugar.