Existe outra maneira simples de anexar a linha ao final do arquivo diferente de ''?

21

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?

    
por Zen 12.01.2015 / 09:57

6 respostas

46

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$ 
    
por 12.01.2015 / 10:12
7

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
}
    
por 12.01.2015 / 10:30
3

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"
    
por 12.01.2015 / 09:59
0

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.

    
por 12.01.2015 / 10:26
-1

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
    
por 12.01.2015 / 10:27
-1

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.

    
por 12.01.2015 / 11:42